天天看點

删除連結清單的中間節點和a/b處的節點

題目:

       給定連結清單的頭節點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
           

繼續閱讀