java單鏈表反轉 詳細講述
reverse1 遍歷法:在連結串列遍歷的過程中將指標順序置換
public static Node reverse1(Node head) {
Node x = null;
Node temp = null;
while (head != null) {
temp = head.next;
head.next = x;
x = head;
head = temp;
}
return x;
}
// reverse1 遍歷法列印 Node temp = reverse1(list.head); System.out.print("遍歷法:"); while (temp.next != null) { System.out.print(temp.data+" "); temp = temp.next; }
提示:
依舊是1->2->3->4
準備兩個空結點 pre用來儲存先前結點、next用來做臨時變數
在頭結點node遍歷的時候此時為1結點
next = 1結點.next(2結點)
1結點.next=pre(null)
pre = 1結點
node = 2結點
進行下一次迴圈node=2結點
next = 2結點.next(3結點)
2結點.next=pre(1結點)=>即完成2->1
pre = 2結點
node = 3結點
進行迴圈…
程式碼提示1
temp = head.next;
...
...
head = temp;
-->>這兩行程式碼是將指標移動,每迴圈一次,head=head.next。程式碼提示2 head.next = x; -->>head.next變為x,在迴圈第一次後可明顯看出將箭頭反轉
x = head; ->>將head賦予x,下一迴圈head.next=x可將下一個結點指向此結點。
reverse2遞迴法:從最後一個Node開始,將指標順序置換
public static Node reverse2(Node head) { if (null == head || null == head.next) return head; Node newHead = reverse2(head.next); head.next.next = head; head.next = null; return newHead; }
// reverse2 遞迴法列印
Node temp = reverse2(list.head);
System.out.print("遞迴法:");
while (temp.next != null) {
System.out.print(temp.data+" ");
temp = temp.next;
}
提示:
總體來說,遞迴法是從最後一個Node開始,在彈棧的過程中將指標順序置換的。
遞迴實質上就是系統幫你壓棧的過程,系統在壓棧的時候會保留現場。
我們來看是怎樣的一個遞迴過程:1->2->3->4
程式到達Node newHead = reverse(head.next);時進入遞迴
我們假設此時遞迴到了3結點,此時head=3結點,temp=3結點.next(實際上是4結點)
執行Node newHead = reverse(head.next);傳入的head.next是4結點,返回的newHead是4結點。
接下來就是彈棧過程了
程式繼續執行 temp.next = head就相當於4->3
head.next = null 即把3結點指向4結點的指標斷掉。
返回新連結串列的頭結點newHead
以上兩種方法在https://blog.csdn.net/weixin_40807247/article/details/91435275大佬文章內均可看到哦
reverse3,頭插法
public void print() {
Node p = head.next;
while (p != null) {
System.out.print(p.data + " ");
p = p.next;
}
System.out.println();
}
public boolean addhead(int x) {
Node xnode = new Node(x, null);
xnode.next = head.next;
head.next = xnode;
length++;
return true;
}
public static linklist reverse3(Node head) {
Node p = head.next;
linklist list2 = new linklist();
while (p != null) {
list2.addhead(p.data);
p = p.next;
}
System.out.println();
return list2;
}
//reserve4 頭插法列印
linklist list2 = reverse3(list.head);
System.out.println("頭插法:");
list2.print();
提示:
此方法即為新建一個連結串列,將舊連結串列的data新增到新連結串列中。