1. 程式人生 > >2.3 刪除鏈表的中間節點和a/b處的節點

2.3 刪除鏈表的中間節點和a/b處的節點

emp ren fir length klist != turn then 刪除結點

題目:給定鏈表的頭結點head,實現刪除鏈表的中間節點的函數

  例如:

  1,不刪除任何節點;

  1 --> 2,刪除節點1;

  1 --> 2 --> 3,刪除節點2;

  1 --> 2 --> 3 --> 4,刪除節點2;

  1 --> 2 --> 3 --> 4 --> 5,刪除節點3;

  進階:

  給定鏈表的頭節點head,整數a和b, 實現刪除位於a/b處節點的函數

  例如:  

  鏈表: 1 --> 2 --> 3 --> 4 --> 5,假設a/b的值為r

  如果r等於0,不刪除任何節點;

  如果r在區間(0, 1/5]上,刪除節點1;

  如果r在區間(1/5, 2/5]上,刪除節點2;

  如果r在區間(2/5, 3/5]上,刪除節點3;

  如果r在區間(3/5, 4/5]上,刪除節點4;

  如果r在區間(4/5, 1]上,刪除節點5;

  如果r大於1,不刪除任何節點

My:

1 def del_midnode(L):
2     if L.length > 1:
3         L.delt((L.length+1)//2)

Reference:

 1 def del_midnode(L):
 2     p = L.head
 3     # if linklist is empty or only have one node
4 if p.next == None or p.next.next == None: 5 return 6 # if linklist only have two nodes, then delete the first 7 if p.next.next.next == None: 8 p.next = p.next.next 9 return 10 # if linklist has not less than three nodes 11 pre = p.next 12 cur = pre.next.next
13 while cur.next != None and cur.next.next != None: 14 pre = pre.next 15 cur = cur.next.next 16 pre.next = pre.next.next

思想:如果鏈表為空或者長度為1, 則不刪除任何結點;如果鏈表長度為2,將頭結點刪除;如果鏈表長度不少於3:當長度為3,則刪除結點2;當長度為4,則刪除結點2;當長度為5,則刪除結點3......從以上分析可看出,當鏈表長度大於3時,鏈表長度每增加2(3, 5, 7...),要刪除的節點就後移一個位置。

2.3 刪除鏈表的中間節點和a/b處的節點