從尾到頭打印鏈表
class Solution:
# 返回從尾部到頭部的列表值序列,例如[1,2,3]
def printListFromTailToHead(self, listNode):
rs = []
if not ListNode:return rs
while listNode:
rs.append(listNode.val)
listNode = listNode.next
return rs[::-1]
刪除鏈表中重複節點
# -*- coding:utf-8 -*-
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
class Solution:
def deleteDuplication(self, pHead):
# write code here
if not pHead:return pHead
dummy = ListNode(-1)
dummy.next = pHead
p = dummy
while p.next:
# 原來錯誤是while dummy.next:
# dummy在while中都沒有發生改變,起不到循環結束的作用
q = p.next
while (q and p.next.val == q.val):
q = q.next
# 如果不存在重複,長度==1
if p.next.next == q:
p = p.next
# 如果存在重複,長度>1
else: p.next = q
return dummy.next
反轉鏈表
class Solution:
def ReverseList(self, pHead):
# 反轉鏈表需要三個listnode
pre = None
cur = pHead
while cur:
tail = cur.next
cur.next = pre
pre = cur
cur = tail
# return cur # cur目前指的是空
return pre
兩個鏈表出現的第一個公共節點(考)
class Solution:
def FindFirstCommonNode(self, pHead1, pHead2):
if not pHead1:return pHead1
if not pHead2:return pHead2
len1 = self.getLength(pHead1)
len2 = self.getLength(pHead2)
diff = abs(len1-len2)
p1 = pHead1
p2 = pHead2
if len1>len2:
while diff>0:
diff -= 1
p1= p1.next
if len1<len2:
while diff>0:
diff -= 1
p2 = p2.next
# print(p1.val)
# print(p2.val)
while p1 != p2:
p1 = p1.next
p2 = p2.next
return p1
def getLength(self,head):
cnt = 0
cur = head
while cur:
cnt+=1
cur = cur.next
return cnt
合併兩個鏈表
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
class Solution:
# 返回合併後列表
def Merge(self, pHead1, pHead2):
# write code here
p1,p2 = None,None
rs = None
head = rs
while pHead1 and pHead2:
if pHead1.val < pHead2.val:
rs.next = pHead1
pHead1 = pHead1.next
else:
rs.next = pHead2
pHead2 = pHead2
rs = rs.next
while pHead1:
rs.next = pHead1
while pHead2:
rs.next = pHead2
return head
複雜鏈表的複製
class Solution:
# 返回 RandomListNode
def Clone(self, pHead):
if not pHead:return None
p = pHead
# 完成節點複製
while p:
node = RandomListNode(p.label)
tail = p.next
p.next = node
node.next=tail
p = tail
# 複製隨機指針
q = pHead
while q:
if q.random:
q.next.random = q.random.next
q = q.next
# 開始連接複製的節點
cloNode = pHead
pHead = pHead.next
while cloNode.next:
node = cloNode.next
cloNode.next = node.next
cloNode = node
return pHead
鏈表中倒數第k個節點
class Solution:
def FindKthToTail(self, head, k):
# write code here
if not head:return head
p = head
cnt = 0
while p:
cnt += 1
p = p.next
if k>cnt:return
n = cnt-k+1
dummy = ListNode(-1)
dummy.next = head
q = dummy
cnt = 0
while q.next:
cnt += 1
if cnt==n:
return q.next.val
q = q.next
鏈表中環入口的位置
class Solution:
def EntryNodeOfLoop(self, pHead):
p1 = pHead #slow
p2 = pHead #fast
meet = pHead
flag = 0
while p2 and p2.next:
p1 = p1.next
p2 = p2.next.next
if p1 == p2:
flag = 1
meet = p1
break
if not flag:
return None
start = pHead
while meet and start:
if meet == start:
return start
meet = meet.next
start = start.next
return None