BM8 链表中倒数最后k个结点

这是一个关于链表算法的问题,要求在给定的链表中找到倒数第k个节点。解决方案是首先反转链表,然后找到第k个节点,再反转回原来的顺序。具体步骤包括反转链表、遍历找到倒数第k个节点并断开连接,最后再次反转以得到正确顺序的结果节点。
摘要由CSDN通过智能技术生成

描述
输入一个长度为 n 的链表,设链表中的元素的值为 ai ,返回该链表中倒数第k个节点。
如果该链表长度小于k,请返回一个长度为 0 的链表。
在这里插入图片描述

要求:空间复杂度 O(n)O(n),时间复杂度 O(n)O(n)
进阶:空间复杂度 O(1)O(1),时间复杂度 O(n)O(n)

例如输入{1,2,3,4,5},2时,对应的链表结构如下图所示:
在这里插入图片描述
其中蓝色部分为该链表的最后2个结点,所以返回倒数第2个结点(也即结点值为4的结点)即可,系统会打印后面所有的节点来比较。
示例1

输入:{1,2,3,4,5},2
返回值:{4,5}
说明:返回倒数第2个节点4,系统会打印后面所有的节点来比较。

示例2

输入:{2},8
返回值:{}

思路
1、链表中找倒数第K 个节点,我们可以将链表反转过来就变成了正数第K个节点,反转代码老套路

ListNode* reverseList(ListNode* head)
    {
        ListNode* pre=NULL;
        ListNode* cur = head;
        while(cur!=NULL)
        {
            ListNode* temp = cur->next;
            cur->next = pre;
            pre= cur;
            cur = temp;
        }
        return pre;
    }

找第k个节点循环
这里建立一个虚拟节点,用于处理k=0的情况

ListNode* dummy = new ListNode(0);
ListNode* head = reverseList(pHead);
dummy->next = head;
ListNode* cur = dummy;
for(int i=0;i<k;i++)
{
  cur = cur->next;
   if(cur==NULL)
  {
      return NULL;
   }
}

2、找到倒数第k个节点,题目中要求输出倒数第K个节点及其之后的节点,现在我们反转过来变成了第K个节点及其之前的。将第K个节点之后的节点舍弃。

 cur->next =NULL;

3、最后需要将所求节点按原来顺序输出,也就是在进行一次反转

ListNode* res = reverseList(dummy->next);

完整代码

class Solution {
public:
    ListNode* reverseList(ListNode* head)
    {
        ListNode* pre=NULL;
        ListNode* cur = head;
        while(cur!=NULL)
        {
            ListNode* temp = cur->next;
            cur->next = pre;
            pre= cur;
            cur = temp;
        }
        return pre;
    }
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param pHead ListNode类 
     * @param k int整型 
     * @return ListNode类
     */
    ListNode* FindKthToTail(ListNode* pHead, int k) {
        if(pHead==NULL)return NULL;
        // write code here
       ListNode* dummy = new ListNode(0);
        ListNode* head = reverseList(pHead);
        dummy->next = head;
        ListNode* cur = dummy;
        for(int i=0;i<k;i++)
        {
            cur = cur->next;
            if(cur==NULL)
            {
                return NULL;
            }
        }
        cur->next =NULL;
        ListNode* res = reverseList(dummy->next);
        return res;
    }
};
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值