LeetCode演算法題206:反轉連結串列解析
阿新 • • 發佈:2018-12-21
反轉一個單鏈表。
示例:
輸入: 1->2->3->4->5->NULL
輸出: 5->4->3->2->1->NULL
進階:
你可以迭代或遞迴地反轉連結串列。你能否用兩種方法解決這道題?
這個題看起來簡單,但是想起來還是得一些小技巧,可能最近腦子不太靈光,這個題竟然想了很久。。。。首先肯定是要用兩種方法的,遞迴法要注意的就是一方面最後返回的節點是頭節點,所以不能變,只能有一個變量表示頭節點,然後中間的話由於要從最後來往回執行,所以一定是要儲存一下當前節點的,而且連結串列可以改變指向,因此從最後往回推那就應該是返回了頭節點,而倒數第二個節點在倒數第二次遞迴中儲存了下來,所以改變其指向就可以。
C++原始碼:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if (head==NULL || head->next==NULL)
return head;
ListNode * p = head;
head = reverseList(p->next);
p->next->next = p;
p->next=NULL;
return head;
}
};
注意這個遞迴程式返回了head,這個head是頭節點,所以返回之後就不可以再動了,其餘操作都是由於後面的節點指向發生了變化所以可以直接進行操作。
迭代法就是在前面設定一個空節點,然後不斷迴圈往中間插就可以。
python3源程式:
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def reverseList(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
if head==None:
return head
preHead = ListNode(0)
preHead.next = head
p = preHead
while head.next:
tmp = head.next
head.next = tmp.next
tmp.next = preHead.next
preHead.next = tmp
return preHead.next