查找链表中倒数第k个元素的方法--c++
来源:互联网 发布:2016年癌症数据 编辑:程序博客网 时间:2024/05/01 16:31
查找链表中倒数第k个元素的方法有2中,一种是正向建表,同时设置两个指针p、q,刚开始p、q指向头结点,然后p开始迁移而q不动,当p指向第k个指针时,p、q开始同时迁移,当p指向最后一个元素时,q指向的为所求倒数第k个元素。
第二中方法是:逆向建表,此时链表中元素离头结点近的为后插入的节点,这样直接找到第k个节点,即为所求节点。
c++实现代码如下[包含两种方法]
//============================================================================
// Name : Kth4.cpp
// Author : andy
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================
//============================================================================
// Name : Kth6.cpp
// Author : andy
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================
#include <iostream>
using namespace std ;
struct Node
{
int data ;
Node * next ;
} ;
const int K = 4 ;
void buildlist(Node * root , int x) ;
void buildlistB(Node * root , int x) ;
void findK(Node * root);
void findKB(Node * root);
void printList(Node * root);
Node * tail = (Node *) malloc(sizeof(Node)) ; //创建记录链表末尾的节点
int main()
{
Node * root = 0 ; //头结点
root = (Node *) malloc(sizeof(Node)) ;
root->data = 0;
root->next = 0 ;
int x ;
/* while(1)
{
cin>>x ;
if(x == 0)
break ;
buildlist(root , x);
}
cout<<"sdsss"<<endl;
printList(root);
findK(root) ;*/
tail=root;
while(1)
{
cin>>x ;
if(x == 0)
break ;
buildlistB(root , x);
}
cout<<"sdsss"<<endl;
printList(root);
findKB(root) ;
// findKB(root);
system("pause") ;
return 0 ;
}
void buildlist(Node * root , int x) //这个是逆向建表,需要采用findK 直接找打第k个元素即可
{
Node * p = (Node *) malloc(sizeof(Node)) ; //创建新的表节点
p->data = x ;
p->next = root->next ;
root->next = p ;
}
void buildlistB(Node * root , int x) //这个是正向建表
{
Node * p = (Node *) malloc(sizeof(Node)) ; //创建新的表节点
p->data = x ;
p->next = 0 ;
tail->next = p ;
tail=p;
}
void findK(Node * root)
{
if(root == 0)
return ;
int i = 0 ;
Node * p = root ; //初始化均指向头结点
Node * q = root ;
bool flag = false ; //判读是否存在倒数第k个数字
while(p->next) //使用头结点
{
i++ ;
p=p->next;
// cout<<" sds"<<p->data<<endl ;
if(i==K) //直到找到第K个,这个是和逆向配到使用的
{
q = p ; // q记载的为所求
flag = true ;
}
}
if(flag)
cout<<q->data<<endl ;
else
cout<<"error"<<endl ;
}
void findKB(Node * root) // 顺序建表,则需要考虑两个指针跨度为k-1,前面指针指导末尾,那么得到的后面的指针得到即为所求
{
if(root == 0)
return ;
int i = 0 ;
Node * p = root ; //初始化均指向头结点
Node * q = root ;
bool flag = false ; //判读是否存在倒数第k个数字
while(p->next) //使用头结点
{
i++ ;
if(i>=K) //直到找到第
{
q = q->next ;
flag = true ;
}
p = p ->next ;
}
if(flag)
cout<<"目标数据:"<<q->data<<endl ;
else
cout<<"error"<<endl ;
}
void printList(Node * root)
{
if(root == 0)
return ;
int i = 0 ;
Node * p = root ; //初始化均指向头结点
// Node * q = root ;
// bool flag = false ; //判读是否存在倒数第k个数字
while(p->next) //使用头结点
{
i++ ;
p = p ->next ;
cout<<"第"<<i<<"个数据为"<<p->data<<endl ;
}
// cout<<i<<endl;
}
- 查找链表中倒数第k个元素的方法--c++
- 查找单链表中倒数第k个元素
- 查找单链表中倒数第k个元素
- 查找单链表倒数第k个元素
- 单链表查找倒数第k个元素
- 查找单链表中倒数第k个元素
- 查找链表的倒数第k个元素
- 查找单链表的倒数第K个元素
- 查找链表中倒数第k个节点元素
- 查找一个单向链表中倒数第K个元素
- 求单链表的倒数第k个元素
- 链表中倒数第K个元素,
- 查找链表中倒数第k个结点
- 查找链表中倒数第k个结点
- 查找链表中倒数第k个结点
- 查找链表中倒数第k个结点
- 查找链表中倒数第 k个结点
- 查找链表中倒数第K个节点
- 左右互搏,基于http的xml消息的服务器和客户端实现
- verilog 层次化设计语言调用的问题终于知道了
- KNN 算法解析和java 代码及python代码实现
- MySQL技术内幕:InnoDB存储引擎读书笔记(下)
- path和classPath的区别
- 查找链表中倒数第k个元素的方法--c++
- Java Bean属性命名规范问题分析
- 浅析互联网场景的身份认证方法(全本)
- 两个栈形成一个队列的JAVA实现
- 快速排序的java实现
- vs2005直接编译WinCE6.0下的Media Player
- 【学习笔记】mysql索引原理之InnoDB
- java 读写文件参考2
- 如何通过GPS获取我当前所在的城市或街道