首页 > 其他 > 详细

代码题(67)— 删除链表的倒数第 N 个结点、链表中倒数第 K个节点

时间:2021-05-25 09:16:06      阅读:20      评论:0      收藏:0      [点我收藏+]

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

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

技术分享图片

 双指针的经典应用,如果要删除倒数第n个节点,让fast移动n步,然后让fast和slow同时移动,直到fast指向链表末尾。删掉slow所指向的节点就可以了。

/**
 * 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) {
        if(head == nullptr || n<=0)
            return nullptr;
        ListNode* dummy = new ListNode(-1);
        dummy->next = head;
        ListNode* fast = dummy;
        ListNode* slow = dummy;
        for(int i=0;i < n+1 ;++i){
            if(fast == nullptr){
                return nullptr;
            }
            fast = fast->next;
        }
        while(fast) {
            fast = fast->next;
            slow = slow->next;
        }
        slow->next = slow->next->next;
        return dummy->next;
    }
};

2、链表中倒数第k个结点

输入一个链表,输出该链表中倒数第k个结点。
如果该链表长度小于k,请返回空。
   ListNode* FindKthToTail(ListNode* head, int k) {
        if(head == nullptr || k <= 0){
            return nullptr;
        }
        ListNode* fast = head, * slow = head;
        for(int i=0;i<k;++i){
            if(fast == nullptr)
                return nullptr;
            fast = fast->next;
        }
        while(fast){
            fast = fast->next;
            slow = slow->next;
        }
        return slow;
    }

 

代码题(67)— 删除链表的倒数第 N 个结点、链表中倒数第 K个节点

原文:https://www.cnblogs.com/eilearn/p/14806800.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!