
如圖:給你鏈表的資料型態要你把它逆序。
就跟二叉樹一樣不知道是誰發明的資料型態。他的結構跟二叉樹只差在分支而已,二叉樹有左右分枝。則鏈表只有下個分支也就是next而已。它的概念是int資料型態會有overflow的問題,只要做成鍊表就沒有這問題了一個位數就存用一個來存。
解這個問題有很多方法。這次使用遞歸來解:
#Python3
# Definition for singly-linked list.
# 題目定義資料型態
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:
# 依照題意head為空直接返回,如果沒有當前所在位子沒有指向下個的話也返回
if head is None or head.next is None:
return head
# 這裡就是最神奇的地方,主要是靠地址修改資料
return_chain = self.reverseList(head.next)
head.next.next = head
head.next = None
return return_chain
#GO
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func reverseList(head *ListNode) *ListNode {
if head == nil || head.Next == nil{
return head
}
returnChain := reverseList(head.Next)
head.Next.Next = head
head.Next = nil
return returnChain
}
其實這四行代碼我覺得牽扯到滿多東西的,所以我本身也不是很確定自己理解正不正確,起初看到遞歸是這樣寫自己也是很不了解。因為再回傳的時候沒有對return_chain做手腳但他的值就是改變了。但是其實...

這是我自己做的圖,就用我理解的下去講。addr就是該obj在記憶體中的地址。origin_chain是它原本的head。所以它遞歸到最後就會回傳8跟next is nil。然後回上一層 傳參再6跟8的狀態。
得到return_chain 接下來要執行 param_chain.next.next = param_chain這行了

就是如圖所示,其實你在更改param_chain的地址的時候因為回傳的跟參數的其實是同一個。所以改參數也有同樣效果。
接著執行 param_chain = None。

也就是把6跟8的關西切掉要不然取值的時候會變成68686868...
這步驟執行完就會變成param_chain是只剩下
6、next is nil。則return_chain是8、next is 6以及6、next is nil。
接著把return_chain回傳到上ㄧ層。就算跑完一次了。
剩下的就以此類推囉...
以上,如果有問題歡迎提問或指正。謝謝。