1. 程式人生 > 實用技巧 >java單鏈表反轉 詳細講述

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新增到新連結串列中。