LeetCode 206:リストリバースリンクリストを逆転

単独リンクリストを逆にします。

単独リンクリストを逆にします。

例:

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

高度:
あなたは、反復逆転または再帰的に一覧表示することができます。次の2つの方法でこの問題を解決することはできますか?

ファローアップ:

リンクリストは、いずれかの繰り返しや再帰的に反転させることができます。あなたは両方を実装してもらえますか?

問題解決のアイデア:

最後のノードへの各トラバースは、時間の複雑さが高すぎる場合にも、このアプローチを取ります。こうした二つの方法、反復と再帰の要件などの高度なトピック:

イテレーション:

各時間サブノードのうちノードプライマリノードとして新しいリストに追加されます。

元のリスト:1-> 2-> 3-> 4-> 5

新しいノードへの最初のノードを分離して、ヘッダリストとして追加される:2-> 3-> 4-> 5:オリジナル1のリスト

ノードとして分離ヘッドノードが新たなリストに追加されている:2-> 1の元のリスト:3-> 4-> 5

ノードが新しいリストに追加される分離ヘッドノード:3-> 2-> 1の元のリスト:> 5 4-

4-> 3-> 2-> 1の元のリスト:5ノードと分離されたヘッドノードが新しいリストに追加されます

ノードが新しいリストに追加される分離ヘッドノード:5-> 4-> 3-> 2-> 1の元のリスト:NULL

Javaの:

class Solution {
    public ListNode reverseList(ListNode head) {
        if (head == null || head.next == null) return head;
        ListNode pre = null;
        ListNode tmp = null;
        while (head != null) {
            tmp = head.next;//tmp暂存当前节点的下一个节点
            head.next = pre;//当前节点下一个指向pre
            pre = head;//刷新pre
            head = tmp;//刷新当前节点为tmp
        }
        return pre;
    }
}

python3:

class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        if not head or not head.next:
            return head
        pre,tmp=None,None
        while(head):
            tmp=head.next
            head.next=pre
            pre=head
            head=tmp
        return pre

再帰:

これは、実際には再帰関数の完全なスタックです:最終

ベースライン条件は、同じであった再帰関数に渡して、リストの最後のノードのオブジェクトを返す(リストの最後に)空のノードを検出しました。一つのノードと新しいノードによって区切られた1つは、リストの末尾から先頭にリストの末尾に追加されます。そして、反復法同様の原理。

元のリスト:1-> 2-> 3-> 4-> 5

再帰最終層遭遇したノードがnullのテール・ノード5を返します。

新しいリストの分割ノードのテール・ノードとして再発バック層5:5、5ブランク元のノード、元のリスト1-> 2-> 3-> 4-> NULL

新しいリストの分割ノードのテール・ノードとして再発バック層4:5-> 4、ブランキング元ノード4、元のリスト1-> 2-> 3-> NULL

バック新しい別個のテール・ノードリストとして前のノード3に再発:5-> 4-> 3、元のノード3、元のリストをブランキング1-> 2-> NULL

バック新しいリンクされたリストとして分割ノード2の前のノードへの再発:5-> 4-> 3-> 2、元のブランキングノード2、元のリスト1-> NULL

バック新しいリンクされたリストとして分割ノードの前のノードへの再発:5-> 4-> 3-> 2-> 1、元のノードブランキング、元のヌルリスト

Javaの:

class Solution {
    public ListNode reverseList(ListNode head) {
        //基线条件
        if (head == null || head.next == null) return head;
        //递归
        ListNode tmp = head.next;//暂存头节点的下一个节点
        ListNode pre = reverseList(head.next);//递归调用该函数,pre为返回的新链表的头节点,原链表的最后一个节点,无论递归多少层该返回值一直传递不变
        tmp.next = head;//暂存的下一个节点指向传入节点
        head.next = null;//下一个节点即原本指向tmp的节点 置空
        return pre;
    }
}

python3:

class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        if not head or not head.next:
            return head
        tmp = head.next
        pre = self.reverseList(head.next)
        tmp.next = head
        head.next = None
        return pre

ブラシ号のタイトルで注目へようこそ:愛のバグを書きます

私はBug.pngを書くのが大好き

おすすめ

転載: www.cnblogs.com/zhangzhe532/p/11224399.html
おすすめ