查找链表中倒数第k个元素的方法--c++

来源:互联网 发布:2016年癌症数据 编辑:程序博客网 时间:2024/05/01 16:31
查找链表中倒数第k个元素的方法--c++
2011-08-25 20:52

查找链表中倒数第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;

 

   }