LeetCodeシリーズの「反転チェーンテーブル」
剣指Offer 24.チェーンテーブルを反転
ListNode
一、反復解法:
反復解法は難しくなく、注意すべき点は2つあります.仮想ノードを必要とせず、pre=nullでよい. ①②③④の順番は固定されています.
二、再帰解法:
再帰的な問題の鍵を利用して、まずreverseList(ListNode head)という関数の役割を理解しなければならない.頭のノードをください.私はこのチェーンテーブルを反転して、反転したチェーンテーブルの頭のノードに戻ることができます.
この関数の内部を考えないで、再帰的な問題を利用してすべてこのようにして、この関数を黒い箱として、それから3つのことを理解します:私にこの関数を与えて、私はある機能を実現することができます 関数のパラメータは何ですか 関数は何を返しますか 次に、この黒い箱を使ってチェーンテーブルを反転し、チェーンテーブルのヘッドノードはheadです.
Node1/head
Node2
Node3
Node4/tail
null
ヘッダーにかかわらず、が起こりますnextノード(すなわちNode 2ノード)はヘッダノードのチェーンテーブルであり、後のノードのnextポインタが反転し、最終head.nextノードがテールノードとなり、 となる.以下 Node 1/ヘッダノード
Node2
Node 4/末尾ノード
Node3
次の2つのステップを実行します. に向ける. に向ける.
Node 4/末尾ノード
Node3
Node2
Node 1/ヘッダノード
null
ListNode
// Definition for singly-linked list.
public class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
}
一、反復解法:
class Solution {
public ListNode reverseList(ListNode head) {
if(head == null) return null;
//
ListNode cur = head;
ListNode pre = null;
while(cur != null){
ListNode nxt = cur.next; // ① cur
cur.next = pre; // ② ,
pre = cur; // ③ pre cur , pre
cur = nxt; // ④
}
return pre;
}
}
反復解法は難しくなく、注意すべき点は2つあります.
二、再帰解法:
class Solution {
public ListNode reverseList(ListNode head) {
if(head == null || head.next == null) return head;
ListNode tmp = reverseList(head.next);
head.next.next = head;
head.next = null;
return tmp;
}
}
再帰的な問題の鍵を利用して、まずreverseList(ListNode head)という関数の役割を理解しなければならない.
この関数の内部を考えないで、再帰的な問題を利用してすべてこのようにして、この関数を黒い箱として、それから3つのことを理解します:
Node1/head
Node2
Node3
Node4/tail
null
ヘッダーにかかわらず、
ListNode tmp = reverseList(head.next);
という操作を実行すると何が起こるのでしょうか.Node2
Node 4/末尾ノード
Node3
次の2つのステップを実行します.
head.next.next = head
Node 2のnextノードをhead head.next = null
headのnextノードをnull Node 4/末尾ノード
Node3
Node2
Node 1/ヘッダノード
null