LeetCode 206. Reverse Linked List(反轉連結串列)兩種方法實現
本文用兩種方法實現連結串列的反轉(LeetCode 206. Reverse Linked List):①利用next指標穿針引線;②遞迴演算法。
題目:
Reverse a singly linked list.
Example:
Input: 1->2->3->4->5->NULL
Output: 5->4->3->2->1->NULL
Follow up:
A linked list can be reversed either iteratively or recursively. Could you implement both?
方法一:利用ListNode的next指標穿針引線,原地反轉。
分析:
head(cur)
1 -> 2 -> 3 -> 4 -> 5 -> NULL
從第一個節點開始,節點1的next指標指向NULL,實現了第一個節點的反轉,反轉以後連結串列變成:
cur
NULL <- 1 2 -> 3 -> 4 -> 5 -> NULL
這樣的話第二個節點就找不到了,需要先儲存一個第二個節點(節點1的下一個節點),所以要定義一個next節點來儲存第二個節點。
cur next
1 -> 2 -> 3 -> 4 -> 5 -> NULL
cur的next指標指向NULL,cur和next後移:
cur next
NULL<- 1 2 -> 3 -> 4 -> 5 -> NULL
這樣更新完之後又會丟失上一個節點,所以也需要一個定義一個pre指標來儲存前一個節點。
pre cur next
NULL 1 -> 2 -> 3 -> 4 -> 5 -> NULL
接著cur節點next指標指向pre:
pre cur next
NULL <- 1 2 -> 3 -> 4 -> 5 -> NULL
向後移動,反轉下個節點:
pre cur next
NULL <- 1 2 -> 3 -> 4 -> 5 -> NULL
執行重複操作,直到完成反轉。程式碼如下:
class Solution {
public ListNode reverseList(ListNode head) {
ListNode pre = null;
ListNode cur = head;
while(cur!=null){
ListNode next = cur.next;
cur.next = pre;
pre = cur;
cur = next;
}
return pre;
}
}
方法二:遞迴演算法實現反轉。
終止條件:head為空或者只有head一個節點的時候,返回head。
遞迴實現:把連結串列看成兩個“節點”,第一個節點是head,第二個節點是剩餘部分,將這兩個節點完成反轉。
程式碼如下:
class Solution {
public ListNode reverseList(ListNode head) {
if(head == null || head.next==null){
return head;
}
ListNode node = reverseList(head.next);
head.next.next = head;
head.next = null;
return node;
}
}