原題:
反轉一個單鏈表。
示例:
輸入: 1->2->3->4->5->NULL
輸出: 5->4->3->2->1->NULL
進階:
你可以迭代或遞歸地反轉鏈表。你能否用兩種方法解決這道題?
解法一(迭代):
本來想寫遞歸的,結果寫着寫着程序變成了迭代。
思路:首先我們看到反轉鏈表,最後其實就是將箭頭方向變換爲反方向。也就是說原理的尾節點變成了首節點。由於單鏈表無法向前搜索,所以我們先創建一個輔助鏈表。本程序我把head作爲了輔助鏈表,將原鏈表賦給pro。pro指向的是我們即將變換的節點。
接下來一步就是變換next,我們假設head是前m個節點且已經反轉完畢的鏈表,我用pro記錄還未反轉的鏈表,之後我用ans先記錄剛剛pro位置,pro繼續向後遍歷。將已經反轉的鏈表表頭head賦給ans.next。ans再賦給head,完成一個新的反轉完畢的鏈表,此時,前pro個節點反轉完畢。
最後,當剩餘最後一個還未反轉(一個節點無需反轉),直接將這個節點連接上head。此時整個鏈表反轉完畢。
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def reverseList(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
if head:
pro = head.next
if pro == None:
return head
head.next = None
else:
return head
while pro.next != None:
ans = pro
pro = pro.next
ans.next = head
head = ans
pro.next =head
return pro
解法二(遞歸法):
我一開始沒有寫對,遞歸法只寫對了一點,對鏈表的認識可能還是有點欠缺(手動狗頭)。
遞歸,我唯一的感悟就是把self.reverseList(head.next)看做一個已經反轉完成的鏈表(也就是說遞歸函數就是我們已經完成的操作結果),之後代入這個操作結果去完成其他的數據處理。
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def reverseList(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
if head == None or head.next is None:
return head
p = self.reverseList(head.next);
head.next.next = head
head.next = None
return p