演算法題:單鏈表反轉
阿新 • • 發佈:2022-03-04
題目解析:
單鏈表
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; privateNode 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; } } }