1. 程式人生 > >刪除連結串列的倒數第 N 個元素

刪除連結串列的倒數第 N 個元素

給定一個連結串列,刪除連結串列的倒數第 個節點,並且返回連結串列的頭結點。

示例:

給定一個連結串列: 1->2->3->4->5, 和 n = 2.

當刪除了倒數第二個節點後,連結串列變為 1->2->3->5.

說明:

給定的 n 保證是有效的。

進階:

你能嘗試使用一趟掃描實現嗎?

這道題最簡單的做法是先遍歷一次連結串列,得到長度,然後再利用for迴圈刪除指定節點即可

最差的情況時間複雜度為O(2n)

比較快的方法是設立兩個指標,先利用n使p指標往前移動一定的距離,然後再將p、q兩個指標同時移動。

當p->next為空時,q的下一個節點就是要刪除的指定節點了。

將輸入處理一下,head為空啊,head->next為空啊這種情況排除掉,就可以了

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
    def removeNthFromEnd(self, head, n):
        """
        :type head: ListNode
        :type n: int
        :rtype: ListNode
        """
        if(n==None):return None #顯然的None
        if(n==0):return head #不用動
        q = head #快指標
        p = head #慢指標
        for i in range(n): #快指標先動
            p = p.next
        if p == None: #此時需要注意的時,p == None 有兩種情況,雖然都是把第一個節點刪除,但q.next == None時,是因為head只有一個節點,q.next != None 時,就是在多個節點裡刪除第一個節點
            if q.next == None:
                return None
            else:
                head = head.next
                return head
        while(p.next!=None):#快慢指標一起動
            q = q.next
            p = p.next
        q.next = q.next.next#跳過指定節點
        return head

#因為比較簡單,所以用的時間跟別人差不多