当前位置:网站首页>剑指offer第22题-链表中倒数第K个节点
剑指offer第22题-链表中倒数第K个节点
2022-08-03 22:20:00 【阿维的博客日记】
假设有n个节点,则计算倒数第k个节点的值,要用双指针
思想:
n个节点,倒数第k个节点。可以画一个图,有9个元素,分别有
a[0]=0
a[1]=1
a[2]=2
a[3]=3
a[4]=4
a[5]=5
a[6]=6
a[7]=7
a[8]=8
然后假设k=3,A指针指向倒数第k个元素6,B指针指向末尾元素
8
因此两个指针之间的下标距离始终相差k-1
=2个(这个容易推导,因为倒数第k个
和末尾元素下标
之间距离就是要减去第k个元素所占的1个位置
,减1是容易推导的),因此当你分析出这个关系,你把A B指针分别平移指向链表第一个元素,第1个元素往后走k-1步的元素的位置
,然后两个指针再次分别同步
依次遍历next指针,遍历到最后就是我们最初的情况,此时A指针恰好指向链表第k个的位置
因此,要保证B指针和A指针始终相差k-1的距离,就要先把B指针先后移k-1次,然后双指针同步便利直到B指针的next为nullptr
最后代码如下,problem22.h是声明,problem22.cpp是函数的实现,最后main.cpp是main函数problem22.h
#ifndef PROBLEM_PROBLEM22_H
#define PROBLEM_PROBLEM22_H
#include <iostream>
struct node {
int value;
struct node *next;
node(int value){
this->value=value;
this->next= nullptr;
}
};
typedef struct node *pnode;
typedef unsigned int uint;
pnode FindKthToTail(pnode pListHead, uint k) ;
void add(pnode& head,int value);
void print(pnode h);
/** * * * @return 一个链表的头指针 */
pnode init();
#endif //PROBLEM_PROBLEM22_H
problem22.cpp
#include <iostream>
#include "problem22.h"
typedef node *pnode;
typedef unsigned int uint;
pnode FindKthToTail(pnode pListHead, uint k) {
pnode pAhead = pListHead;
pnode pBehind = nullptr;
for (int i = 0; i < k - 1; ++i) {
pAhead = pAhead->next;
}
pBehind = pListHead;
while (pAhead->next != nullptr) {
pAhead = pAhead->next;
pBehind = pBehind->next;
}
return pBehind;
}
void add(pnode& head,int value){
if(head== nullptr){
head=new node(value);
return;
}
pnode ptr=head;
while (ptr->next!= nullptr){
ptr=ptr->next;
}
pnode new_node=new node(value);
ptr->next=new_node;
return;
}
void print(pnode h){
pnode ptr=h;
while (ptr){
printf("%d " ,ptr->value);
ptr=ptr->next;
}
}
/** * * * @return 一个链表的头指针 */
pnode init(){
pnode head=new node(1);
add(head,2);
add(head,3);
add(head,4);
add(head,5);
add(head,6);
add(head,7);
add(head,8);
add(head,9);
// add(head,10);
// print(head);
return head;
}
main.cpp
#include <iostream>
#include "problems/problem22.h"
using namespace std;
int main() {
std::cout << "Hello, World!" << std::endl;
pnode hA = init();
pnode node = FindKthToTail(hA,3);
printf("%d",node->value);
return 0;
}
边栏推荐
猜你喜欢
[N1CTF 2018]eating_cms
DO280管理和监控OpenShift平台--资源限制
for循环练习题
CAS:1192802-98-4_UV 裂解的生物素-PEG2-叠氮
[MySQL Advanced] Creation and Management of Databases and Tables
CAS:1620523-64-9_Azide-SS-biotin_biotin-disulfide-azide
CAS:122567-66-2_DSPE-生物素_DSPE-Biotin
数据一致性:双删为什么要延时?
嵌入式开发:嵌入式基础——代码和数据空间揭秘
2022-08-03 Oracle executes slow SQL-Q17 comparison
随机推荐
Embedded systems: overview
Golang第二章:程序结构
start with connect by implements recursive query
LitJson报错记录
On the Qixi Festival of 2022, I will offer 7 exquisite confession codes, and at the same time teach you to quickly change the source code for your own use
VIM操作
2022-08-02 mysql/stonedb慢SQL-Q18-内存使用暴涨分析
Bytebase database schema change management tool
Causes of Mysql Disk Holes and Several Ways to Rebuild Tables
LabVIEW代码生成错误 61056
start with connect by 实现递归查询
Nine ways to teach you to read the file path in the resources directory
三年黑盒测试工程师对嵌入式软件测试的理解
2022-08-03 oracle执行慢SQL-Q17对比
用于流动质押和收益生成的 Web3 基础设施
授人以渔 - 如何自行查询任意 SAP UI5 控件属性的文档和技术实现细节试读版
CAS:908007-17-0_Biotin-azide _生物素叠氮化物
CAS:1620523-64-9_Azide-SS-biotin_生物素-二硫-叠氮
Diazo Biotin-PEG3-DBCO | Diazo Compound Modified Biotin-Tripolyethylene Glycol-Dibenzocyclooctyne
嵌入式系统:时钟