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

Wain ... 2022-5-11 Algorithm
  • Leetcode
  • 双指针
About 1 min

# Leetcode-19 删除链表的倒数第n个结点

# 题目描述

​ 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

题目链接 (opens new window)

# 样例

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

提示:

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

# 解题思路

​ 感觉应该是第二次做这道题了,这次果断用双指针。虽说是双指针,实际上建了4个,但最有用的是那两个。同时要注意加个哨兵根节点,这样进行删除操作时更加方便,可以定位到前一个节点。核心是让first节点先从哨兵节点跑n+1步(head节点开始跑n步),然后再用一个循环定位到倒数n-1个节点,把倒数第n个删了,最后也只需要返回哨兵节点的下一个节点作为根节点。

# 代码

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode* first = head;
        ListNode* dump = new ListNode(101);
        ListNode* last = dump;
        last->next = head;
        for(int i = 0; i < n; i++){
            first = first->next;
        }
        while(first){
            first = first->next;
            last = last->next;
        }
        ListNode* tmp = last;
        last = last->next;
        tmp->next = last->next;
        return dump->next;
    }
};

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Last update: May 12, 2022 15:22