Loading

Leetcode - 19. 删除链表的倒数第 N 个结点

给你一个链表,删除链表的倒数第n个结点,并且返回链表的头结点。
进阶:你能尝试使用一趟扫描实现吗?

示例 1:

输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]

示例 2:

输入:head = [1], n = 1
输出:[]

示例 3:

输入:head = [1,2], n = 1
输出:[1]

提示:

  • 链表中结点的数目为 sz
  • 1 <= sz <= 30
  • 0 <= Node.val <= 100
  • 1 <= n <= sz

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解1 2021/8/29 O(n)

# Definition for singly-linked list.
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next
    def __repr__(self):
        return '{}'.format(self.val) + (('->' + self.next.__repr__()) if self.next else '')

def removeNthFromEnd(head: ListNode, n: int) -> ListNode:
    # 题目要求只遍历一遍,可以这样
    # 比如,倒数第3个,用两个指针同时步进,等第2个指针到达尾部,要删的就是第1个指针所在的位置
    # ↓   ↓
    # 1 2 3 4 5 6 ...
    # 为了操作方便,加个空的头,两个指针往前挪一格,这样好删
    #     ↓   ↓
    # dummy 1 2 3 4 5 6 ...
    dummy=ListNode(-1)
    dummy.next=head
    l=r=dummy
    # 先假设题目给的都是合理的,看ac不ac
    while n-1:
        n-=1
        r=r.next
    while r.next.next:
        l=l.next
        r=r.next
    # del
    l.next=l.next.next
    return dummy.next

if __name__ == '__main__':
    head=ListNode(1,ListNode(2,ListNode(3,ListNode(4,ListNode(5,ListNode(6))))))
    head=removeNthFromEnd(head,2)
    print(head)
    head=ListNode(1,ListNode(2,ListNode(3,ListNode(4,ListNode(5,ListNode(6))))))
    head=removeNthFromEnd(head,1)
    print(head)
    head=ListNode(1,ListNode(2,ListNode(3,ListNode(4,ListNode(5,ListNode(6))))))
    head=removeNthFromEnd(head,3)
    print(head)
    head=ListNode(1)
    head=removeNthFromEnd(head,1)
    print(head)
    head=ListNode(1,ListNode(2))
    head=removeNthFromEnd(head,1)
    print(head)

posted @ 2021-08-29 16:57  wwcg2235  阅读(33)  评论(0)    收藏  举报