劍指Offer 刪除鍊錶中重複的節點

2021-09-11 16:02:47 字數 2411 閱讀 5107

本文首發於我的個人部落格suixin』s blog
鍊錶的基礎知識+python實現四種鍊錶

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

看起來題目挺簡單的,其實做起來坑很多,需要用一點小技巧;

坑:需要完全去掉重複的節點而不是保留乙個、需要返回煉表頭指標;

特殊輸入測試:空鍊錶、首節點重複、連續多個重複、完全重複的鍊錶。

python(2.7.3)

# -*- coding:utf-8 -*-

# class listnode:

# def __init__(self, x):

# self.val = x

# self.next = none

class

solution

:def

deleteduplication

(self, phead)

:# write code here

pre_head = listnode(0)

pre_head.

next

= phead

pre = pre_head

cur = phead

while cur is

notnone

:if cur.

next

isnot

none

and cur.

next

.val == cur.val:

tmp = cur.

next

while tmp is

notnone

and tmp.val == cur.val:

tmp = tmp.

next

pre.

next

= tmp

cur = tmp

else

: pre = cur

cur = cur.

next

return pre_head.

next

占用記憶體:5828k

採用遞迴思想將滿足一定條件的後半段鍊錶遞迴地呼叫函式本身。詳見**注釋。

# -*- 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 phead is

none

or phead.

next

isnone

:return phead

real_head = phead # real_head為原煉表去重複節點之後的煉表頭指標

aft = phead.

next

# aft為原鍊錶的第二個節點

if aft.val != real_head.val:

# 若前兩個節點不同,則real_head就是phead。對後面的子鍊錶遞迴呼叫

real_head.

next

= self.deleteduplication(aft)

else

:# 若前兩個節點相同,則需找出真正的煉表頭節點

tmp = aft

# 迴圈向後找到與phead不同的那個節點

while tmp.val == real_head.val and tmp.

next

isnot

none

: tmp = tmp.

next

if tmp.val != real_head.val:

# 則後半段子鍊錶的煉表頭為原鍊錶的煉表頭(有可能再次遞迴,但不影響)

real_head = self.deleteduplication(tmp)

else

:# 若整個鍊錶完全重複則返回none

return

none

return real_head

占用記憶體:5856k

劍指offer 鍊錶 刪除鍊錶中的重複節點

題目在乙個排序的鍊錶中,存在重複的結點,請刪除該鍊錶中重複的結點,重複的結點不保留,返回煉表頭指標。例如,鍊錶1 2 3 3 4 4 5 處理後為 1 2 5 思路分析 思路一 使用linkedlist儲存不重複節點,重構鍊錶 分析評價 這個方法是乙個比較直接且容易想到的方法,使用時只要注意一些情況...

劍指offer 刪除鍊錶中重複的結點(鍊錶)

在乙個排序的鍊錶中,存在重複的結點,請刪除該鍊錶中重複的結點,重複的結點不保留,返回煉表頭指標。例如,鍊錶1 2 3 3 4 4 5 處理後為 1 2 5 class solution listnode ans newlistnode 1 ans next phead listnode link a...

劍指Offer 鍊錶 刪除鍊錶中重複的結點

題目 在乙個排序的鍊錶中,存在重複的結點,請刪除該鍊錶中重複的結點,重複的結點不保留,返回煉表頭指標。例如,鍊錶1 2 3 3 4 4 5 處理後為 1 2 5。注意該鍊錶為排序鍊錶,重複的節點不保留哦!public class listnode 1 遞迴 遞迴的方法就像是先判斷第乙個節點和之後的節...