單鏈表之反轉(zhuǎn)鏈表:迭代式(Reverse a LinkList :iterative way)
一、問題描述
1、文字描述
有一個長度大于1的鏈表,具有屬性elem和next,其中next為鏈表結(jié)點單元的引用域,elem為鏈表結(jié)點單元的值。鏈表頭部是self._head,第一個結(jié)點引用域指向第二個結(jié)點,第二個結(jié)點指向下一個結(jié)點,以此類推,尾部指向null。希望能將此鏈表反轉(zhuǎn),即self.__head原最后一個結(jié)點指向原倒數(shù)第二個結(jié)點,原第二個結(jié)點指向原第一個結(jié)點,原第一個結(jié)點指向null。
2、圖片描述
將黑色的鏈表情況轉(zhuǎn)化為紅色的鏈表情況
反轉(zhuǎn)鏈表問題圖片描述
二、解決方案
1、元分析
可以通過問題描述看出,反轉(zhuǎn)鏈表最簡單的情況是鏈表中只有兩個結(jié)點,所以在這里我們將兩個結(jié)點抽出來做元分析。
反轉(zhuǎn)鏈表問題元分析
為了使得分析具有一般通用性,我們更改一下變量,其中curr(current的縮寫)為正在操作的結(jié)點,Prev(previous)為前一結(jié)點,NextN(NextNode)為下一個結(jié)點,為了不與屬性next混淆
反轉(zhuǎn)鏈表一般性分析
2、偽代碼
- 將curr的下一個結(jié)點用NextN保存
- 下一個結(jié)點指向prev
- 在將curr移向下一個結(jié)點之前,將現(xiàn)在指向的結(jié)點用prev保存
- 將curr移向下一個結(jié)點
- 只要curr不是最后一個變量,則循環(huán)不停止
3、代碼與實例
1.代碼
def reverse_SingularLsitBegin(curr):
prev = None
while curr.next is not None:
NextN = curr.next
curr.next = pre
prev = curr#現(xiàn)在pre是第一個結(jié)點
curr = NextN
curr.next = prev
return curr
2.實例
mlist1.printall()
mlist1._head = reverse_SingularLsitBegin(mlist1._head)
mlist1.printall()
結(jié)果
反轉(zhuǎn)之前與反轉(zhuǎn)之后的鏈表值
三、聯(lián)系方式
如果您對今天的反轉(zhuǎn)鏈表的敘述方式或者解決方案有意見或者建議,歡迎與我聯(lián)系!