劍指Offer 程式設計題56 刪除鍊錶中重複的結點

2021-08-21 15:22:44 字數 1351 閱讀 5980

題目:在乙個排序的鍊錶中,存在重複的結點,請刪除該鍊錶中重複的結點,重複的結點不保留,返回煉表頭指標。 例如,鍊錶1->2->3->3->4->4->5 處理後為 1->2->5

牛客網:鏈結

leetcode同題:leetcode82:remove duplicates from sorted list ii

leetcode變題:leetcode83:remove duplicates from sorted list

刪除重複結點,只需要記錄當前結點前的最晚訪問過的不重複結點ppre、當前結點pcur、指向當前結點後面的結點pnext的三個指標即可。如果當前節點和它後面的幾個結點數值相同,那麼這些結點都要被剔除,然後更新ppre和pcur;如果不相同,則直接更新ppre和pcur。

需要考慮的是,如果第乙個結點是重複結點我們該怎麼辦?這裡我們分別處理一下就好,如果第乙個結點是重複結點,那麼就把頭指標phead也更新一下。

# -*- 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 none

'''兩個變數可以操作同一塊位址'''

ppre = none

pcur = phead

while pcur:

'''一定要判斷.next是否存在 none是沒有val值的'''

if pcur.next and pcur.val == pcur.next.val:

pnext = pcur.next

'''一定要判斷.next是否存在 none是沒有val值的'''

while pnext.next and pnext.next.val == pcur.val:

pnext = pnext.next

if pcur == phead:

phead = pnext.next

else:

ppre.next = pnext.next

pcur = pnext.next

'''如果13334444這種情況出現 不else 就會跳過第乙個4 所以必須用if else分開'''

else:

ppre = pcur

pcur = pcur.next

return phead

劍指Offer 程式設計題56(鍊錶中環的入口位址)

可以用兩個指標來解決這個問題。先定義兩個指標p1和p2指向鍊錶的頭結點。如果鍊錶中環有n個結點,指標p1在鍊錶上向前移動n步,然後兩個指標以相同的速度向前移動。當第二個指標指向環的入口結點時,第乙個指標已經圍繞著環走了一圈又回到了入口結點。剩下的問題就是如何得到環中結點的數目。我們在面試題15的第二...

劍指offer 第56題 刪除鍊錶中重複的結點

在乙個排序的鍊錶中,存在重複的結點,請刪除該鍊錶中重複的結點,重複的結點不保留,返回煉表頭指標。例如,鍊錶1 2 3 3 4 4 5 處理後為 1 2 5 兩個指標,p1,p2,p1記錄當前不重複的最前乙個結點,p2負責探路 如果p2和p2.next不相等,則p2,p1都向後移動乙個 如果相等,p2...

劍指offer 程式設計題

輸入兩個整數序列,第乙個序列表示棧的壓入順序,請判斷第二個序列是否可能為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的乙個彈出序列,但4,3,5,1,2就不可能是該壓棧序列的彈出序列。注意 這兩個序列的長度是相等的 ...