逆轉前: 1 -> 2 -> 3 -> 4 -> 5 -> nullhtml
逆轉後: 5 -> 4 -> 3 -> 2 -> 1 -> nullnode
我的博客地址:逆轉單向鏈表bash
public Node reverse(Node head) {
if (head == null || head.next == null) {
return head;
}
// 取前面節點
Node pre = head;
// 取後面節點
Node cur = head.next;
// 臨時節點
Node temp = null;
while (cur != null) {
// 1. 保存後節點的指向節點 由於要替換後節點的指向節點爲他的前節點
temp = cur.next;
// 2. 把後節點的指向的節點替換成前節點
cur.next = pre;
// 下一輪要替換的前節點和後節點
// 第一次 pre = 1 cur =2 || 那第二次 就得 pre = 2 cur = 3
pre = cur;
cur = temp;
}
// 在上述過程當中未替換首節點的指向節點 這裏首節點將成爲尾節點 因此指向null
head.next = null;
// 由於循環的條件是cur是否爲null 若是cur爲null 那 pre將是原來鏈表的尾節點
// 就是逆轉後的首節點
return cur;
}
複製代碼
public Node recursionNode(Node head) {
if (head == null || head.next == null) {
return head;
}
// head 1 2 3 4
Node node = reverseNode(head.next);
// 展現順序 head 4 3 2 1
// 第一輪:
// 當前指向順序 4 -> 5
head.next.next = head; // 變成了 5 -> 4 可是4的指針仍然指向5 也就是雙向的
// 因此 4 -> null 變成單向
head.next = null;
// node是最後一個元素 5 也就是逆轉後的 第一個元素
return node;
}複製代碼