題目:給定單鏈表的頭指標和乙個結點指標,定義乙個函式在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 常規的做法是從頭結點開始順序查詢到要...