用python介紹4種常用的單鏈表翻轉的方法小結
如何把一個單鏈表進行反轉?
方法1:將單鏈表儲存為數組,然后按照數組的索引逆序進行反轉。
方法2:使用3個指針遍歷單鏈表,逐個鏈接點進行反轉。
方法3:從第2個節(jié)點到第N個節(jié)點,依次逐節(jié)點插入到第1個節(jié)點(head節(jié)點)之后,最后將第一個節(jié)點挪到新表的表尾。
方法4: 遞歸(相信我們都熟悉的一點是,對于樹的大部分問題,基本可以考慮用遞歸來解決。但是我們不太熟悉的一點是,對于單鏈表的一些問題,也可以使用遞歸??梢哉J為單鏈表是一顆永遠只有左(右)子樹的樹,因此可以考慮用遞歸來解決?;蛘哒f,因為單鏈表本身的結構也有自相似的特點,所以可以考慮用遞歸來解決)
開辟輔助數組,新建表頭反轉,就地反轉,遞歸反轉
# -*- coding: utf-8 -*-
'''
鏈表逆序
'''
class ListNode:
def __init__(self,x):
self.val=x
self.next=None
'''
第一種方法:
對于一個長度為n的單鏈表head,用一個大小為n的數組arr儲存從單鏈表從頭
到尾遍歷的所有元素,在從arr尾到頭讀取元素簡歷一個新的單鏈表
時間消耗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
'''
開始以單鏈表的第一個元素為循環(huán)變量cur,并設置2個輔助變量tmp,保存數據;
newhead,新的翻轉鏈表的表頭。
時間消耗O(n),空間消耗O(1)
'''
def reverse_linkedlist2(head):
if head == None or head.next == None: #邊界條件
return head
cur = head #循環(huán)變量
tmp = None #保存數據的臨時變量
newhead = None #新的翻轉單鏈表的表頭
while cur:
tmp = cur.next
cur.next = newhead
newhead = cur # 更新 新鏈表的表頭
cur = tmp
return newhead
'''
開始以單鏈表的第二個元素為循環(huán)變量,用2個變量循環(huán)向后操作,并設置1個輔助變量tmp,保存數據;
時間消耗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 #保存數據的臨時變量
while p2:
tmp = p2.next
p2.next = p1
p1 = p2
p2 = tmp
head.next = None
return p1
'''
遞歸操作,先將從第一個點開始翻轉轉換從下一個節(jié)點開始翻轉
直至只剩一個節(jié)點
時間消耗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
到此這篇關于用python介紹4種常用的單鏈表翻轉的方法小結的文章就介紹到這了,更多相關python 單鏈表翻轉內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
python用matplotlib繪制二維坐標軸,設置箭頭指向,文本內容方式
這篇文章主要介紹了python用matplotlib繪制二維坐標軸,設置箭頭指向,文本內容方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08
Python的Flask項目中獲取請求用戶IP地址 addr問題
這篇文章主要介紹了Python的Flask項目中獲取請求用戶IP地址 addr問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-01-01
使用Python的pencolor函數實現(xiàn)漸變色功能
這篇文章主要介紹了使用Python的pencolor函數實現(xiàn)漸變色功能,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-03-03
python中class(object)的含義是什么以及用法
這篇文章主要介紹了python中class(object)的含義是什么以及用法說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-02-02

