面試題13 在O 1 時間刪除單鏈表結點

2021-07-11 10:15:25 字數 1540 閱讀 6054

題目:給定單鏈表的頭指標和乙個結點指標,定義乙個函式在o(1)時間刪除節點。

從頭開始順序遍歷單鏈表,遇到要刪除的節點跳過去就行了

因為已經給了要刪除節點的指標,可以找到待刪除節點的寫乙個節點的值,複製到待刪除節點,將該節點的next指標指向next.next就行了,流程如下:

(1) a->b->c->d->e 要刪除的是c節點

(2) a->b->d->d->e 將待刪除節點的下乙個節點的值複製到該節點

(3) a->b->d   d->e 將待刪除節點的next指向它的next.next

|          ^

(1)要刪除節點是頭結點

(2)要刪除節點是為節點(順序遍歷找到尾節點的上乙個節點,並刪除)

#coding:utf-8

# 面試題13:在o(1)時間刪除單鏈表節點

# 初始化單鏈表

class node(object):

def __init__(self, val, p=0):

self.data = val

self.next = p

class linklist(object):

def __init__(self):

self.head = 0

def initlist(self, data):

self.head = node(data[0])

p = self.head

if data[0] == 'd':

self.target = self.head

for i in data[1:]:

node = node(i)

p.next = node

p = p.next

if i == 'd':

self.target = p

return self.head, self.target # 生成完單鏈表返回頭結點指標,目標刪除指標

data = ['a','b','c','d','e']

l = linklist()

listhead, deletenode = l.initlist(data) # 頭結點指標

def deletenode(listhead, deletenode):

if listhead == deletenode: # 要刪除節點是頭結點

listhead = listhead.next

elif deletenode.next == none: # 要刪除節點為尾節點

prenode = listhead

while true:

if prenode.next == deletenode:

prenode.next = none

else:

prenode = prenode.next

else: # 要刪除節點是中間節點

deletenode.data = deletenode.next.data

deletenode.next = deletenode.next.next

在O 1 時間刪除單鏈表結點

出處 題目 給定單向鍊錶的頭指標和乙個結點指標,定義乙個函式在o 1 時間刪除該結點。原文採用的是c c 這裡採用c 節點定義如下 public class node 指標域 public nodenext publicnode publicnode t item 要實現的deletenode方法定...

面試題13 在O 1 時間刪除鍊錶結點

題目 給定單向鍊錶的頭指標和乙個結點指標,定義乙個函式在o 1 時間刪除該結點。鍊錶結點與函式的定義如下 struct listnode 在單向鍊錶中刪除乙個結點,最常規的方法是從頭到尾掃瞄一遍找到結點,然後刪除結點。對於給定的是值得結點,沒有辦法只能從頭到尾掃瞄乙個乙個對比值得大小,如果鍊錶中存在...

面試題13 在O 1 時間刪除鍊錶結點

面試題13 題目 給定單向鍊錶的頭指標和乙個指標結點,定義乙個函式在o 1 時間刪除該結點。鍊錶結點與函式的定義如下 struct listnode void deletenode listnode plisthead,listnode ptobedeleted 常規的做法是從頭結點開始順序查詢到要...