刪除連結串列的倒數第 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
#因為比較簡單,所以用的時間跟別人差不多