输入一个链表,输出该链表中倒数第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];
}
};
// 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)