時間限制:1秒 空間限制:32768k
輸入乙個鍊錶,反轉鍊錶後,輸出鍊錶的所有元素。
解法一.迴圈反轉鍊錶(非遞迴法)
整體思路就是,從原鍊錶的頭部乙個乙個取節點並插入到新鍊錶的頭部
p始終指向要反轉的結點
newhead 指向反轉後的首結點
每反轉乙個結點,把p結點的next指向newhead, newhead再移動到p的位置成為反轉後首結點, 再把p通過tmp儲存的位置向後移動乙個結點直至none結束
最後p=tmp就可以取回原鍊錶的資料了,所有迴圈訪問也可以繼續展開下去。
進行下一次迭代,指標繼續向後移動,直到p指標指向null停止迭代。
};python解法
# -*- coding:utf-8 -*-
# class listnode:
# def __init__(self, x):
# self.val = x
# self.next = none
class
solution:
# 返回listnode
defreverselist
(self, phead):
# write code here
ifnot phead or
not phead.next:
return phead
newhead = none
while phead:
tmp = phead.next
phead.next = newhead
newhead = phead
phead = tmp
return newhead
2.遞迴法
遞迴的方法其實是非常巧的,它利用遞迴走到鍊錶的末端,然後再更新每乙個node的next 值 ,實現鍊錶的反轉。而newhead 的值沒有發生改變,為該鍊錶的最後乙個結點,所以,反轉後,我們可以得到新鍊錶的head。
注意關於鍊錶問題的常見注意點的思考:
1、如果輸入的頭結點是 null,或者整個鍊錶只有乙個結點的時候
2、鍊錶斷裂的考慮
struct listnode
};*/
class solution
}};
python
# -*- coding:utf-8 -*-
# class listnode:
# def __init__(self, x):
# self.val = x
# self.next = none
class
solution:
# 返回listnode
defreverselist
(self, phead):
ifnot phead or
not phead.next :
return phead
tmp=phead.next
phead.next=none
res=self.reverselist(tmp)
tmp.next=phead
return res
由此對於該問題我們知道迭代是從前往後依次處理,直到迴圈到鏈尾;而遞迴恰恰相反,首先一直迭代到鏈尾也就是遞迴基判斷的準則,然後再逐層返回處理到開頭。
總結來說,鍊錶翻轉操作的順序對於迭代來說是從鏈頭往鏈尾,而對於遞迴是從鏈尾往鏈頭。
演算法題009 反轉單鏈表 by java
反轉單鏈表,可以使用迭代或者遞迴的方法 具象化反轉單鏈 反轉前 反轉中 反轉後 ps 上述搬運自 鏈表面試題 一 反轉鍊錶的演算法實現 以上就是每乙個節點都需要做的事情了,不管是迭代的方法還是遞迴的方法都是這樣的步驟。然而需要考慮的還不止這麼多,比如第乙個節點的上乙個節點的處理,以及方法結束時的返回...
單鏈表反轉演算法
struct listnode 想到兩種方法 想法是構建乙個新的單鏈表,然後遍歷原來的單鏈表,每遍乙個就把它插入到最新的單鏈表的開頭,下面是 struct listnode reverselist struct listnode list temp list last null while temp...
C 演算法 反轉單鏈表
反轉單鏈表,我使用了兩種方法,不過他們都很相近。宣告 class clist 宣告反轉單鏈表函式 void reversesll clist clist prenode nullptr void csinglelinkedlist reversesll clist node,clist prenod...