题目描述
输入一个链表,输出该链表中倒数第k个结点。
解题思路:这个题比较基础,主要考察链表的操作。两个思路:1.先将链表进行遍历,用vector将每个数据进行存储,然后直接找到某个数 2.先遍历链表,记录节点个数,再一次遍历,将数据取出
参考答案(时间复杂度大于O(n)):
#include <iostream>
#include <vector>
#include <string>
#include <stack>
#include <algorithm>
#include <math.h>
using namespace std;
struct ListNode {
int val;
struct ListNode *next;
};
class Solution {
public:
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
if (pListHead == NULL)
{
cout<<"pListHead = NULL fault"<<endl;
return NULL;
}
int count = 1;
ListNode* pmove = pListHead;
while (pmove != NULL)
{
pmove = pmove->next;
count++;
}
k = count - k;
if (k <= 0)
{
cout<<"k <= 0 fault"<<endl;
return NULL;
}
pmove = pListHead;
for (int i = 0; i < k-1; ++i) {
pmove = pmove->next;
}
return pmove;
}
};
int main()
{
//创建链表
vector<int > array_list;
Solution solution;
//初始化链表内的参数
ListNode ListNode3 = {3,NULL};
ListNode ListNode2 = {2,&ListNode3};
ListNode ListNode1 = {1,&ListNode2};
//将头指针指向第一个链表的地址
ListNode *head = &ListNode1;
ListNode *my_result = NULL;
my_result = solution.FindKthToTail(head,4);
cout<<"result:"<<my_result->val<<endl;
return 0;
}
优化代码:(使用vetocr进行存储,然后读取,时间复杂度为O(n))
class Solution {
public:
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
if(pListHead == NULL)
return pListHead;
vector<ListNode*> arr_l_node;
ListNode* my_head = pListHead;
while (my_head != NULL)
{
arr_l_node.push_back(my_head);
my_head = my_head->next;
}
if (k > arr_l_node.size())
return pListHead;
return arr_l_node[arr_l_node.size()-k];
}
};
更加优化代码(使用两个指针,时间复杂度同样为O(n),空间复杂度优于前面两种)
class Solution {
public:
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
//k如果等于0,因为是无符号数,k-1就变成了0xffffffff,而不是-1
if(pListHead == NULL || k == 0)
return pListHead;
int count = 0;
ListNode* P1;
ListNode* P2;
P1 = P2 = pListHead;
//P2先走k-1步
while (count < k-1)
{
//
if (P2->next == NULL)
return NULL;
P2 = P2->next;
count++;
}
//P1,P2一起走完
while (P2->next != NULL)
{
P1 = P1->next;
P2 = P2->next;
count++;
}
return P1;
}
};
7389



被折叠的 条评论
为什么被折叠?



