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

  1. 题目链接

  2. 解题思路:可以定义一个node节点,然后一个cur节点,node节点先走n-1步,然后cur和node同时走,如果node->next == null了,那么cur就是被删除的节点,此时,我们用pre节点指向cur的前一个节点(node和cur在走的时候,pre也跟着走),就可以删除cur节点了。

    • 还有一种特例,删除的节点就是头节点
    • 如果听不懂在说什么,可以画个图,具体的例子看看。
  3. 代码

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode() : val(0), next(nullptr) {}
     *     ListNode(int x) : val(x), next(nullptr) {}
     *     ListNode(int x, ListNode *next) : val(x), next(next) {}
     * };
     */
    class Solution {
    public:
        ListNode* removeNthFromEnd(ListNode* head, int n) {
            ListNode *first = head;  // 先走n    
            ListNode *cur = head;
            ListNode *pre = nullptr;
            while(--n) {
                first = first->next;
            }
            while(first->next != nullptr) {
                first = first->next;
                pre = cur;
                cur = cur->next;
            }
            if (pre != nullptr) {
                pre->next = cur->next;
                return head;
            }
            // 删除的就是头节点
            return head->next;
        }
    };
    
posted @ 2024-12-18 10:46  ouyangxx  阅读(21)  评论(0)    收藏  举报