链表中倒数第k个结点

  1. 剑指 Offer 22. 链表中倒数第k个节点

  输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。
    
  例如,一个链表有 `6` 个节点,从头节点开始,它们的值依次是 `1、2、3、4、5、6`。这个链表的倒数第 `3` 个节点是值为 `4` 的节点。

示例:

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

返回链表 4->5.

这道题很简单,但这里讲的不是该怎么做,而是做这道题的方法与思路;

解题方法
一.

先遍历一遍,求出链表总的长度,然后再遍历一遍求出倒数第k个值在哪里.(不推荐这种方法,因为要遍历两次,不划算)

二.

先遍历一遍,将链表的每个节点都记录下来(用数组),同时也能够记录下来链表总的长度,然后经过计算,直接取出倒数第k个值;(这是读完题后我的解题方法)

缺点:数组的长度不确定,容易浪费或超出;增加了空间复杂度;(vector的容量会自动扩展.在没有进行处理的情况下,存储的数越多,浪费的空间也就越多.)

class Solution {
public:
    ListNode* getKthFromEnd(ListNode* head, int k) {
        vector<ListNode*>arr;
        int cnt=0;
        while(head!=NULL)
        {
            arr.push_back(head);
            cnt++;
            head=head->next;
        }
        return arr[cnt-k];
    }
};

image-20210228164850373


//   Definition for singly-linked list.
struct ListNode
{
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};

class Solution
{
public:
    ListNode *getKthFromEnd(ListNode *head, int k)
    {

        int cnt = 0;
        ListNode *temp1 = head;
        ListNode *temp2 = head;
        while (cnt != k)
        {
            temp1 = temp1->next;
            cnt++;
        }
        while (temp1)
        {
            temp1 = temp1->next;
            temp2 = temp2->next;
        }
        return temp2;
    }
};

ext;
temp2 = temp2->next;
}
return temp2;
}
};

![image-20210228164857038](https://img-blog.csdnimg.cn/img_convert/9e7bdd989764bbeca76e705be335e953.png)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值