演算法題 反轉單鏈表

2021-08-20 11:35:08 字數 2122 閱讀 4421

時間限制: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...