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

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

题目描述:

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

示例:

给定一个链表: 1->2->3->4->5, 和 n = 2.

当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:

给定的 n 保证是有效的。

进阶:

你能尝试使用一趟扫描实现吗?

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

提交一:扫描一趟(size - n + 1)

在这里插入图片描述

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    int listSize(ListNode* head){
        int size = 0;
        ListNode* pMove = head;
        if(!pMove) return size;
        while(pMove){
            size++;
            pMove=pMove->next;
        }
        return size;
    }
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        int pos = listSize(head) - n + 1;   //要删除节点的位置(1-n)
        if(pos == 1)//删除首节点,单独列出来
        {
            ListNode* nextNode = head->next;
            delete head;
            return nextNode;
        }
        ListNode* frontPosNode = head;
        ListNode* posNode = head->next;
        for(int i=0;i<pos-2;i++)
        {
            frontPosNode = posNode;
            posNode = posNode->next;
        }
        frontPosNode->next = posNode->next;
        delete posNode;
        return head;
    }
};

提交二:双指针

在这里插入图片描述

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
 //frontNode和tailNode相距n个结点,然后并排向后移
class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode* frontNode = head;
        ListNode* tailNode = head;
        for(int i = 0;i < n;i++)//移动tailNode,使得tailNode较frontNode靠后n个结点
        {
            tailNode = tailNode->next;
        }
        if(!tailNode)//tailNode到达尾结点的下一个,说明是头删
        {
            ListNode* nextNode = head->next;
            delete head;
            return nextNode;
        }
        while(tailNode->next){//一自将tailNode移动到尾节点(tailNode->next==nullptr)
            tailNode=tailNode->next;
            frontNode=frontNode->next;
        }
        //tailNode到达尾节点后,frontNode在删除节点的前面
        ListNode* deleteNode = frontNode->next;
        frontNode->next = deleteNode->next;
        delete deleteNode;  //不忘delete
        return head;
    }
};
发布了57 篇原创文章 · 获赞 12 · 访问量 3281

猜你喜欢

转载自blog.csdn.net/weixin_44795839/article/details/104248818