题目:返回链表倒数第k个结点的值
解题思路:快慢指针
int kthToLast(LinkList& L, int k){
ListNode* left = L;
ListNode* right = L;
//right先向后移动k个位置
while(k --) right = right->next;
//两个指针同时向后移动,当right指向空时,left指向倒数第k个结点
while(right != NULL){
left = left->next;
right = right->next;
}
return left->val;
}
全部代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef struct node{
int val;
struct node* next;
}ListNode,*LinkList;
int kthToLast(LinkList& L, int k){
ListNode* left = L;
ListNode* right = L;
//right先向后移动k个位置
while(k --) right = right->next;
//两个指针同时向后移动,当right指向空时,left指向倒数第k个结点
while(right != NULL){
left = left->next;
right = right->next;
}
return left->val;
}
//尾插法
ListNode* createListR(int finish){ //约定以finish结束
int x;
cin >> x;
if(x == finish) return NULL; //递归边界
ListNode* p = new ListNode;
p->val = x;
p->next = createListR(finish); //把剩余的创建任务交给下一层
return p;
}
void printList(ListNode* p){
if(p == NULL) return;
cout<<p->val<<" ";
printList(p->next);
}
int main(){
cout<<"递归尾插法创建链表:"<<endl;
ListNode* p = createListR(9999);
cout<<"打印链表:"<<endl;
printList(p);
cout<<endl;
int k = 3;
cout<<"倒数第"<<k<<"个结点的值为"<<kthToLast(p, k)<<endl;
}
运行结果:
更多代码请参考:手撕考研数据结构(代码汇总)