分別實現兩個函式,乙個可以刪除單鏈表中倒數第k個節點,另乙個可以刪除雙鏈表中倒數第k個節點。
從問題當中,我們只能得到乙個鍊錶和要刪除的第k個節點的資訊,於是就有以下思路:如果鍊錶為空或者k<0時,直接返回;如若不然,遍歷鍊錶的每個節點,每經過乙個節點k減1。比如對於1 --> 2 --> 3 --> 4該鍊錶的過程如下:
k = 5,所遍歷的節點以及k值的變化:1 -- > 2 --> 3 --> 4 4,3,2,1;
k = 4,所遍歷的節點以及k值的變化:1 -- > 2 --> 3 --> 4 3,2,1,0;
k = 3,所遍歷的節點以及k值的變化:1 -- > 2 --> 3 --> 4 2,1,0,-1;
k = 2,所遍歷的節點以及k值的變化:1 -- > 2 --> 3 --> 4 1,0,-1,-2;
由上可知,遍歷鍊錶中的節點,每經過乙個節點k值減1的過程中,當k > 1時,說明鍊錶中要刪除的倒數第k個節點不存在,此時已經超出鍊錶的長度;當k = 0時,此時正好要刪除的是鍊錶中的第乙個節點,這是只需頭節點指向頭節點的下乙個節點即可;那麼對於k < 0時,該如何刪除鍊錶中倒數第k的節點呢?
經過上面的步驟後,如果k<0,此時重新遍歷鍊錶,只不過這時是每經過乙個節點k值增1。如下示例(k值儲存經過減1後的結果):
k = -1,所遍歷的節點以及k值的變化:1 0;
k = -2,所遍歷的節點以及k值的變化:1 -- > 2 -1,0;
在遍歷鍊錶k值增1的過程中,當k = 0時,所在的位置正好是要刪除倒數第k個節點的前乙個節點,此時只需將前乙個節點指向要刪除的節點的下一節點即可。
1view codeclass
node(object):
2def
__init__
(self, data):
3 self.data =data
4 self.next =none56
defcreatesinglelink():
7 head = node(1)
8 cur =head
9for i in range(2, 10):
10 cur.next =node(i)
11 cur =cur.next
12return
head
1314
defprintsinglelink(head):
15 cur =head
16while
cur:
17print(cur.data, end='')18
ifcur.next:
19print('
-->
', end=''
)20 cur =cur.next
2122
defremovelastkthnode(head, lastkth):
23if head is none or lastkth <0:
24return
head
25 cur =head26#
lastkth -= 1
27while
cur:
28 lastkth -= 1
29 cur =cur.next30#
print(lastkth)
31if lastkth ==0:
32 head =head.next
33if lastkth <0:
34 cur =head
35 lastkth += 1
36while lastkth <0:
37 cur =cur.next
38 lastkth += 1
39 cur.next =cur.next.next
40return
head
4142
if__name__ == '
__main__':
43 singlehead =createsinglelink()
44printsinglelink(singlehead)
45print
()46 newsinglehead = removelastkthnode(singlehead, 6)
47 printsinglelink(newsinglehead)
上述**是對刪除單鏈表倒數第k個節點的實現,那麼對於雙鏈表的實現過程和單鏈表的過程相同,只不過在刪除某一節時要注意節點的前驅指標的指向。
1view codeclass
node(object):
2def
__init__
(self, data):
3 self.last =none
4 self.data =data
5 self.next =none67
defcreatedoublelink():
8 head = node(1)
9 cur =head
10for i in range(2, 10):
11 cur.next =node(i)
12 cur =cur.next
13return
head
1415
defprintlink(head):
16 cur =head
17while
cur:
18print(cur.data, end='')19
ifcur.next:
20print('
-->
', end=''
)21 cur =cur.next
2223
defremovelastkthnode(head, lastkth):
24if head is none or lastkth <0:
25return
head
26 cur =head
27while
cur:
28 lastkth -= 1
29 cur =cur.next
30if lastkth ==0:
31 head =head.next
32 head.last =none
33if lastkth <0:
34 cur =head
35 lastkth += 1
36while lastkth <0:
37 cur =cur.next
38 lastkth += 1
39if
cur.next.next:
40 cur.next =cur.next.next
41 cur.next.last =cur
42else
:43 cur.next =none
44return
head
4546
if__name__ == '
__main__':
47 doublelinkhead =createdoublelink()
48printlink(doublelinkhead)
49print
()50 newdoublelinkhead = removelastkthnode(doublelinkhead, 6)
51 printlink(newdoublelinkhead)
刪除鍊錶中倒數第K個節點,
題目 輸入乙個鍊錶,輸出該鍊錶的倒數第k個節點。為了符合大多數的習慣,最後乙個節點從1開始計數,即鍊錶的尾部節點為倒數第乙個節點。鍊錶定義如下 struct listnode listnode createlistnode int value void connectlistnodes listno...
刪除鍊錶中倒數第K個節點
這裡演算法的思路很簡單,就是利用雙指標進行定位,筆記主要記錄的是c 的一些基礎知識,也就是關於指標傳遞的一些知識。bool deletelistnode int k,list list 傳入的是鍊錶指標的引用,也就是直接操作實參鍊錶,好處是當需要刪除首指標時,可以將鍊錶的head向next賦值即可,...
在鍊錶中刪除倒數第K個節點
給出乙個單鏈表,返回刪除單鏈表的倒數第 k 個節點的鍊錶。輸入描述 n 表示鍊錶的長度。val 表示鍊錶中節點的值。輸出描述 在給定的函式內返回鍊錶的頭指標。示例1輸入5 4 1 2 3 4 5輸出1 3 4 5備註 1 k n 1 06 1 leq k leq n leq 10 6 1 k n 1...