Description
题目
19. Remove Nth Node From End of List Medium
Given a linked list, remove the n-th node from the end of list and return its head.
Example
Given linked list: 1->2->3->4->5, and n = 2.
After removing the second node from the end, the linked list becomes 1->2->3->5.
Note:
Given n will always be valid.
Follow up:
Could you do this in one pass?
题目大意
删除一链表中的倒数第n个节点
解题思路
双指针:p1从头节点开始,p2从第n个节点开始,同时依次遍历,到p2指向为Null时,p1恰好指向要删除倒数第n个节点的前一个节点。另外注意,由于可能删除头部节点,申明一个新的头部方便操作。
code
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
L = ListNode(0)
L.next = head
p1 = p2 = L
for i in range(n+1):
p1 = p1.next
while p1:
p1 = p1.next
p2 = p2.next
p2.next = p2.next.next
return L.next
Runtime:32ms
参考较优解
解题思路
先是使指针cur指向链表第n个位置,若cur不空,则以cur前面节点的个数依次将cur后移,直到cur为空为止。这种解法也是类似双指针思路,稍加转换而已。
code
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
cur = head
for i in range(n):
cur = cur.next
if not cur:
head = head.next
return head
else:
pre = head
cur = pre.next
while cur:
for i in range(n):
cur = cur.next
if not cur:
pre.next = pre.next.next
return head
else:
pre = pre.next
cur = pre.next
Runtime:16ms