鍊錶中刪除倒數第K個節點

2022-09-03 03:09:07 字數 3983 閱讀 9354

分別實現兩個函式,乙個可以刪除單鏈表中倒數第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個節點的前乙個節點,此時只需將前乙個節點指向要刪除的節點的下一節點即可。

1

class

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)

view code

上述**是對刪除單鏈表倒數第k個節點的實現,那麼對於雙鏈表的實現過程和單鏈表的過程相同,只不過在刪除某一節時要注意節點的前驅指標的指向。

1

class

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)

view code

刪除鍊錶中倒數第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...