1. 程式人生 > 其它 >演算法題:單鏈表反轉

演算法題:單鏈表反轉

題目解析:

單鏈表

A.next->B

B.next->C

C.next->D

D.next->E

A->B->C->D->E

反轉後

E->D->C->B->A

手動反轉

1、B.next=A

2、C.next=B

3、D.next=C

4、E.next=D

5、A.next=null

6、返回E

由於物件的next被設定後會丟失原來的指向,難以繼續往後遍歷替換。

所以想到的方式是遞迴,即

A、B交換->B、C交換->C、D交換->D、E交換;

終止條件是交換行為中的第二個節點的next為空

然後清除掉原來頭節點的next指向

一、先嚐試for、while迴圈,發現不好寫出來,感覺更像遞迴,因為遞迴會取到記憶體(所以遞迴寫法記憶體佔用會高)

二、確定用遞迴寫之後,要先找到遞迴終止條件。從實際的手推例子,認為第二個節點的next為空是終止條件

三、需要清除掉原來頭節點的next指向,必須返回原來的尾部節點

package lession4;

public class SinglyLinkedListsInversion {

    static class Node {
        private final String name;
        private
Node next; public Node(String name, Node next) { this.name = name; this.next = next; } } public static void main(String[] args) { Node root = new Node("A", new Node("B", new Node("C", new Node("D", new Node("E", null))))); // A->B->C->D->E
// B.next=A // C.next=B // D.next=C // E.next=D Node node = swap(root, root.next); root.next = null; do { System.out.println(node.name); } while ((node = node.next) != null); } public static Node swap(Node a, Node b) { // 終止條件是右側比較節點的next為空 if (b.next == null) { b.next = a; // 這個要作為最終返回的頭節點 return b; } else { // 遞迴 Node swap = swap(b, b.next); // 交換過a、b、c中的b、c之後,即c.next=b,還需要把b.next=a b.next = a; // 遞迴結束返回,實則返回的是終止條件中的返回值 return swap; } } }