題目
給定一個鏈表,刪除鏈表的倒數(shù)第 n 個節(jié)點(diǎn)预柒,并且返回鏈表的頭結(jié)點(diǎn)。
-
示例:
給定一個鏈表: 1->2->3->4->5, 和 n = 2. 當(dāng)刪除了倒數(shù)第二個節(jié)點(diǎn)后礁击,鏈表變?yōu)?1->2->3->5.
說明:
給定的 n 保證是有效的琅豆。
進(jìn)階:
你能嘗試使用一趟掃描實(shí)現(xiàn)嗎朱浴?
解答
-
思路:
- 用雙指針法七蜘;
- 首先讓一個right指針沃粗,先指向第n + 1個節(jié)點(diǎn)柄粹,讓一個left指針指向頭節(jié)點(diǎn)喘鸟;
- 然后讓兩個指針一起右移,直到right指針為None停止驻右;(過程中使用pre指針記錄left指針的左邊節(jié)點(diǎn)什黑,初始pre為None)
- 最后刪除left指向的那個節(jié)點(diǎn)即可。
-
代碼:
def removeNthFromEnd(self, head, n): """ :type head: ListNode :type n: int :rtype ListNode (knowledge) 思路: 1. 用雙指針法堪夭; 2. 首先讓一個right指針愕把,先指向第n + 1個節(jié)點(diǎn),讓一個left指針指向頭節(jié)點(diǎn)森爽; 3. 然后讓兩個指針一起右移恨豁,直到right指針為None停止;(過程中使用pre指針記錄left指針的左邊節(jié)點(diǎn)爬迟,初始pre為None) 4. 最后刪除left指向的那個節(jié)點(diǎn)即可 """ pre, left, right = None, head, head # 首先讓right指針指向第n + 1個節(jié)點(diǎn) for i in range(n): right = right.next # left和right兩個指針一起右移橘蜜,同時使用pre記錄left指針的左邊節(jié)點(diǎn) while right: pre, left, right = left, left.next, right.next if not pre: # 處理要刪除的節(jié)點(diǎn)是頭節(jié)點(diǎn)的情況 return head.next else: pre.next = left.next return head
測試驗證
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
def __repr__(self):
if self:
return "{}->{}".format(self.val, repr(self.next))
class Solution:
def removeNthFromEnd(self, head, n):
"""
:type head: ListNode
:type n: int
:rtype ListNode
(knowledge)
思路:
1. 用雙指針法;
2. 首先讓一個right指針雕旨,先指向第n + 1個節(jié)點(diǎn)扮匠,讓一個left指針指向頭節(jié)點(diǎn);
3. 然后讓兩個指針一起右移凡涩,直到right指針為None停止棒搜;(過程中使用pre指針記錄left指針的左邊節(jié)點(diǎn),初始pre為None)
4. 最后刪除left指向的那個節(jié)點(diǎn)即可
"""
pre, left, right = None, head, head
# 首先讓right指針指向第n + 1個節(jié)點(diǎn)
for i in range(n):
right = right.next
# left和right兩個指針一起右移活箕,同時使用pre記錄left指針的左邊節(jié)點(diǎn)
while right:
pre, left, right = left, left.next, right.next
if not pre: # 處理要刪除的節(jié)點(diǎn)是頭節(jié)點(diǎn)的情況
return head.next
else:
pre.next = left.next
return head
if __name__ == '__main__':
solution = Solution()
head = ListNode(1)
head.next = ListNode(2)
head.next.next = ListNode(3)
head.next.next.next = ListNode(4)
head.next.next.next.next = ListNode(5)
print(solution.removeNthFromEnd(head, 2), "= 1->2->3->5")