用python介紹4種常用的單鏈表翻轉(zhuǎn)的方法小結(jié)
如何把一個(gè)單鏈表進(jìn)行反轉(zhuǎn)?
方法1:將單鏈表儲(chǔ)存為數(shù)組,然后按照數(shù)組的索引逆序進(jìn)行反轉(zhuǎn)。
方法2:使用3個(gè)指針遍歷單鏈表,逐個(gè)鏈接點(diǎn)進(jìn)行反轉(zhuǎn)。
方法3:從第2個(gè)節(jié)點(diǎn)到第N個(gè)節(jié)點(diǎn),依次逐節(jié)點(diǎn)插入到第1個(gè)節(jié)點(diǎn)(head節(jié)點(diǎn))之后,最后將第一個(gè)節(jié)點(diǎn)挪到新表的表尾。
方法4: 遞歸(相信我們都熟悉的一點(diǎn)是,對(duì)于樹的大部分問題,基本可以考慮用遞歸來解決。但是我們不太熟悉的一點(diǎn)是,對(duì)于單鏈表的一些問題,也可以使用遞歸??梢哉J(rèn)為單鏈表是一顆永遠(yuǎn)只有左(右)子樹的樹,因此可以考慮用遞歸來解決?;蛘哒f,因?yàn)閱捂湵肀旧淼慕Y(jié)構(gòu)也有自相似的特點(diǎn),所以可以考慮用遞歸來解決)
開辟輔助數(shù)組,新建表頭反轉(zhuǎn),就地反轉(zhuǎn),遞歸反轉(zhuǎn)
# -*- coding: utf-8 -*- ''' 鏈表逆序 ''' class ListNode: def __init__(self,x): self.val=x self.next=None ''' 第一種方法: 對(duì)于一個(gè)長度為n的單鏈表head,用一個(gè)大小為n的數(shù)組arr儲(chǔ)存從單鏈表從頭 到尾遍歷的所有元素,在從arr尾到頭讀取元素簡歷一個(gè)新的單鏈表 時(shí)間消耗O(n),空間消耗O(n) ''' def reverse_linkedlist1(head): if head == None or head.next == None: #邊界條件 return head arr = [] # 空間消耗為n,n為單鏈表的長度 while head: arr.append(head.val) head = head.next newhead = ListNode(0) tmp = newhead for i in arr[::-1]: tmp.next = ListNode(i) tmp = tmp.next return newhead.next ''' 開始以單鏈表的第一個(gè)元素為循環(huán)變量cur,并設(shè)置2個(gè)輔助變量tmp,保存數(shù)據(jù); newhead,新的翻轉(zhuǎn)鏈表的表頭。 時(shí)間消耗O(n),空間消耗O(1) ''' def reverse_linkedlist2(head): if head == None or head.next == None: #邊界條件 return head cur = head #循環(huán)變量 tmp = None #保存數(shù)據(jù)的臨時(shí)變量 newhead = None #新的翻轉(zhuǎn)單鏈表的表頭 while cur: tmp = cur.next cur.next = newhead newhead = cur # 更新 新鏈表的表頭 cur = tmp return newhead ''' 開始以單鏈表的第二個(gè)元素為循環(huán)變量,用2個(gè)變量循環(huán)向后操作,并設(shè)置1個(gè)輔助變量tmp,保存數(shù)據(jù); 時(shí)間消耗O(n),空間消耗O(1) ''' def reverse_linkedlist3(head): if head == None or head.next == None: #邊界條件 return head p1 = head #循環(huán)變量1 p2 = head.next #循環(huán)變量2 tmp = None #保存數(shù)據(jù)的臨時(shí)變量 while p2: tmp = p2.next p2.next = p1 p1 = p2 p2 = tmp head.next = None return p1 ''' 遞歸操作,先將從第一個(gè)點(diǎn)開始翻轉(zhuǎn)轉(zhuǎn)換從下一個(gè)節(jié)點(diǎn)開始翻轉(zhuǎn) 直至只剩一個(gè)節(jié)點(diǎn) 時(shí)間消耗O(n),空間消耗O(1) ''' def reverse_linkedlist4(head): if head is None or head.next is None: return head else: newhead=reverse_linkedlist4(head.next) head.next.next=head head.next=None return newhead def create_ll(arr): pre = ListNode(0) tmp = pre for i in arr: tmp.next = ListNode(i) tmp = tmp.next return pre.next def print_ll(head): tmp = head while tmp: print tmp.val tmp=tmp.next a = create_ll(range(5)) print_ll(a) # 0 1 2 3 4 a = reverse_linkedlist1(a) print_ll(a) # 4 3 2 1 0 a = reverse_linkedlist2(a) print_ll(a) # 0 1 2 3 4 a = reverse_linkedlist3(a) print_ll(a) # 4 3 2 1 0 a = reverse_linkedlist4(a) print_ll(a) # 0 1 2 3 4
到此這篇關(guān)于用python介紹4種常用的單鏈表翻轉(zhuǎn)的方法小結(jié)的文章就介紹到這了,更多相關(guān)python 單鏈表翻轉(zhuǎn)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- python數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)之實(shí)現(xiàn)線性表的順序
- python數(shù)據(jù)結(jié)構(gòu)之線性表的順序存儲(chǔ)結(jié)構(gòu)
- python實(shí)現(xiàn)單鏈表的方法示例
- python如何實(shí)現(xiàn)單鏈表的反轉(zhuǎn)
- Python單鏈表原理與實(shí)現(xiàn)方法詳解
- Python棧的實(shí)現(xiàn)方法示例【列表、單鏈表】
- Python實(shí)現(xiàn)棧的方法詳解【基于數(shù)組和單鏈表兩種方法】
- python實(shí)現(xiàn)從尾到頭打印單鏈表操作示例
- python版單鏈表反轉(zhuǎn)
- Python線性表種的單鏈表詳解
相關(guān)文章
Python設(shè)計(jì)模式行為型責(zé)任鏈模式
這篇文章主要介紹了Python設(shè)計(jì)模式行為型責(zé)任鏈模式,責(zé)任鏈模式將能處理請求的對(duì)象連成一條鏈,并沿著這條鏈傳遞該請求,直到有一個(gè)對(duì)象處理請求為止,避免請求的發(fā)送者和接收者之間的耦合關(guān)系,下圍繞改內(nèi)容介紹具有一點(diǎn)的參考價(jià)值,需要的朋友可以參考下2022-02-02python用matplotlib繪制二維坐標(biāo)軸,設(shè)置箭頭指向,文本內(nèi)容方式
這篇文章主要介紹了python用matplotlib繪制二維坐標(biāo)軸,設(shè)置箭頭指向,文本內(nèi)容方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08python調(diào)用staf自動(dòng)化框架的方法
今天小編就為大家分享一篇python調(diào)用staf自動(dòng)化框架的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-12-12Python的Flask項(xiàng)目中獲取請求用戶IP地址 addr問題
這篇文章主要介紹了Python的Flask項(xiàng)目中獲取請求用戶IP地址 addr問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01使用Python的pencolor函數(shù)實(shí)現(xiàn)漸變色功能
這篇文章主要介紹了使用Python的pencolor函數(shù)實(shí)現(xiàn)漸變色功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03將pytorch轉(zhuǎn)成longtensor的簡單方法
今天小編就為大家分享一篇將pytorch轉(zhuǎn)成longtensor的簡單方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-02-02python中class(object)的含義是什么以及用法
這篇文章主要介紹了python中class(object)的含義是什么以及用法說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02