查找链表中倒数第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++
最新推荐文章于 2022-01-06 02:42:20 发布
2011-08-25 20:52