反轉鍊錶
輸入乙個鍊錶,反轉鍊錶後,輸出新鍊錶的表頭。
筆記:看到第一思路是用list做,結果一直出錯,看了高分回答不太理解,找了資料,直到找到最詳細的**部落格,感謝大神~
如何把乙個單鏈表進行反轉?
方法1:將單鏈表儲存為陣列,然後按照陣列的索引逆序進行反轉。
方法3:從第2個節點到第n個節點,依次逐節點插入到第1個節點(head節點)之後,最後將第乙個節點挪到新錶的表尾。
方法4: 遞迴(相信我們都熟悉的一點是,對於樹的大部分問題,基本可以考慮用遞迴來解決。但是我們不太熟悉的一點是,對於單鏈表的一些問題,也可以使用遞迴。可以認為單鏈表是一顆永遠只有左(右)子樹的樹,因此可以考慮用遞迴來解決。或者說,因為單鏈表本身的結構也有自相似的特點,所以可以考慮用遞迴來解決)
方法1:浪費空間
是比較容易想到的,但是總是出錯,目前都沒找到原因,**先放在這裡,後面熟練了再改改看~
錯誤的**
# -*- coding:utf-8 -*-
# class listnode:
# def __init__(self, x):
# self.val = x
# self.next = none
class solution:
# 返回listnode
def reverselist(self, phead):
# write code here
l =
while phead != none:
phead = phead.next
res = {}
i = len[l] -1
while i>= 0:
res = i
i -= 1
return res
方法2:3個指標遍歷單鏈表,感謝大神的詳細講解使用p和q兩個指標配合工作,使得兩個節點間的指向反向,同時用r記錄剩下的鍊錶。
現在進入迴圈體,這是第一次迴圈。
第二次迴圈。
第三次迴圈。。。。。
python**:
# -*- coding:utf-8 -*-
# class listnode:
# def __init__(self, x):
# self.val = x
# self.next = none
class solution:
# 返回listnode
def reverselist(self, phead):
# write code here
# write code here
if not phead or not phead.next:
return phead
last = none
while phead:
tmp = phead.next
phead.next = last
last = phead
phead = tmp
return last
**方法三:**比較好容易理解所有不加上圖了,但是**自己用python還是寫不出來,倒了一下,能讀懂**,菜是原罪呀~
**如下:p一直向後移動,直到末尾~
def func2(head):
p = head.next
while p.next:
q = p.next
p.next = q.next
head.next = q
q.next = p
p.next = head #形成環形
head = head.next
p.next.next = none #斷開連線
return head
方法4:遞迴發現大部分問題都可以從遞迴角度想想,所以這道題目也從遞迴角度想了想。
現在需要把a->b->c->d進行反轉,
可以先假設b->c->d已經反轉好,已經成為了d->c->b,那麼接下來要做的事情就是將d->c->b看成乙個整體,讓這個整體的next指向a,所以問題轉化了反轉b->c->d。那麼,
可以先假設c->d已經反轉好,已經成為了d->c,那麼接下來要做的事情就是將d->c看成乙個整體,讓這個整體的next指向b,所以問題轉化了反轉c->d。那麼,
可以先假設d(其實是d->null)已經反轉好,已經成為了d(其實是head->d),那麼接下來要做的事情就是將d(其實是head->d)看成乙個整體,讓這個整體的next指向c,所以問題轉化了反轉d。
上面這個過程就是遞迴的過程,這其中最麻煩的問題是,如果保留新鍊錶的head指標呢?想到了兩個辦法。
/ 遞迴版的第一種實現,借助類的成員變數m_phead來表示新鍊錶的頭指標。
第二個辦法是,增加乙個引用型引數 new_head,它用來儲存新鍊錶的頭指標。
筆記:有些沒怎麼看懂的,記下來後面繼續看~
def func3(head):
if head.next == none:
return head
new_head = func3(head.next)
head.next.next = head
head.next = none
return new_head
Python之單鏈表的翻轉
給定乙個鍊錶,將該鍊錶翻轉,並返回頭結點 鍊錶的翻轉 class node def init self,val none self.val val self.next none class linklist def init self self.head node def fanzhuan1 sel...
單鏈表翻轉
關於單鏈表的翻轉問題頗為困擾人。下面寫的程式只需遍歷每個節點一次,並且不需要構造輔助接點 通過new的方式 另外這個問題可以轉換為乙個迴圈鍊錶結構,很有意思。h struct node class cdatastruct cpp檔案 cdatastruct cdatastruct void cdat...
單鏈表翻轉
1,原理 使用p和q兩個指標配合工作,使得兩個節點間的指向反向,同時用r記錄剩下的鍊錶。p head q head next head next null 現在進入迴圈體,這是第一次迴圈。r q next q next p p q q r 第二次迴圈。r q next q next p p q q ...