題目:
給定連結清單的頭節點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 -> 5k,假設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,不删除任何節點
基本思路
原問題。
觀察題目,我們可以發現,連結清單長度每增加2,要删除的節點就往後移動一位。我們隻要利用這個規律找到要删除節點的前一個節點,問題就解決了。
進階問題。
首先,根據連結清單的長度n,以及a與b的值确定要删除的節點是哪一個節點。計算方法如下:
r = math.ceil(a / b * n),其中ceil函數是向上取整,a / b的值是浮點型。
知道要删除哪一個節點後,隻需要找到該節點的前一個節點即可。
"""基本問題"""
class Node:
def __init__(self,value):
self.value = value
self.next = None
def removeMidNode(head):
if head==None or head.next == None:
return head
if head.next.next == None:
return head.next
pre = head
cur = head.next.next
while cur.next==None or cur.next.next==None:
pre = pre.next
cur = cur.next.next
pre.next = pre.next.next
return head
def removeByRatio(head,a,b):
if head == None or a > b or a < 1:
return head
n = 0
cur = head
while cur!=None:
n +=1
cur = cur.next
import math
n = math.ceil(a/b * n)
if n==1:
return head.next
if n > 1:
cur = head
while n - 1 !=1:
cur = cur.next
n -=1
cur.next = cur.next.next
return head