public class A {
public static void main(String[] args) {
ListNode root = new ListNode(1);
ListNode node1 = new ListNode(2);
ListNode node2 = new ListNode(3);
ListNode node3 = new ListNode(4);
ListNode node4 = new ListNode(5);
ListNode node5 = new ListNode(6);
root.next = node1;
node1.next = node2;
node2.next = node3;
node3.next = node4;
node4.next = node5;
ListNode listNode0 = reverse1(root);
print(listNode0);
ListNode listNode = reverse2(root);
print(listNode);
}
/**
* -1->1->2->3
* 思想是總是選取當前元素放到dummy的後面
*
* @param head
* @return
*/
private static ListNode reverse2(ListNode head) {
ListNode dummy = new ListNode(-1);
dummy.next = head;
//pre一直都是dummy的next的節點,但是位置一直在變化
ListNode pre = dummy.next;
ListNode cur = pre.next;
while (cur != null) {
//先把當前元素抽取走
pre.next = cur.next;
//再把當前元素的下一個指針指定dummy的後面
cur.next = dummy.next;
//dummy的後面再執行這個新元素
dummy.next = cur;
//pre一直沒變化,他的下一個就是之前的cur.next
cur = pre.next;
}
return dummy.next;
}
/**
* 遞歸解法,一直遞歸到最後一個開始翻轉這個鏈表
*
* @param pre
* @return
*/
private static ListNode reverse1(ListNode pre) {
if (pre == null || pre.next == null) {
return pre;
}
ListNode listNode = reverse1(pre.next);
ListNode current = pre.next;
current.next = pre;
//斷鏈
pre.next = null;
return listNode;
}
private static void printReverse(ListNode root) {
if (root == null) {
return;
}
printReverse(root.next);
System.out.println(root.val);
}
private static void print(ListNode root) {
for (ListNode node = root; node != null; node = node.next) {
System.out.println(node.val);
}
}
}
class ListNode {
int val;
ListNode next;
public ListNode(int val) {
this.val = val;
}
}
20.解悶算法-單鏈表的翻轉
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.