博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【原创】编程题练习:头插法尾插法建立单链表及找寻单链表中的倒数第K个节点...
阅读量:4691 次
发布时间:2019-06-09

本文共 1963 字,大约阅读时间需要 6 分钟。

边界条件需要注意:两种方法,第一种遍历链表,寻找到节点,然后从头结点开始,寻找第n-k+1个节点;第二种方法,两个指针,第一个先走k-1步,然后第二个指针和第一个一起走,到尾节点的时候,第二个指针指向的节点就是倒数第k个节点了。

 

在程序中两方法没按顺序写。

切记 每次赋值都是赋头指针给p或者q。

  1 #include<iostream>
  2 
  3  
using 
namespace std;
  4 
  5  typedef 
struct List
  6  {
  7      
int data;
  8      
struct List *next;
  9  }List;
 10  
 11  
void HeadCreatList (List *L)
 12  {
 13      List *s;
 14      L->next=NULL;
 15      
for (
int i=
0;i<
10;i++)
 16      {
 17          s=
new List;
 18          s->data=i;
 19          s->next=L->next;
 20          L->next=s;
 21      }
 22  }
//
头插法建立链表
 23 
 
void TailCreatList(List *L)
 24  {
 25      List *s,*r;
 26      r=L;
 27      
for (
int i=
0;i<
10;i++)
 28      {
 29          s = 
new List;
 30          s->data=i;
 31          r->next=s;
 32          r=s;
 33      }
 34      r->next=NULL;
 35  }
//
尾插法建立链表
 36 
 
void DisPlay(List *L)
 37  {
 38      List *p=L->next;
 39      
while(p!=NULL)
 40      {
 41          cout << p->data;
 42          p = p->next;
 43      }
 44      cout << endl;
 45  }
 46 
void FindBackKthNode_1(List *L,
int k)
 47 {
 48     
if(L == NULL)
 49         
return ;
 50     List *p,*q;
 51     p = L;
 52     q = L;
 53     
int i;
 54     
for(i = 
0;i<k;i++)
 55     {
 56         
if(p->next == NULL)
 57         {
 58             cout << 
"
K is too big
" << endl;
 59             
return ;
 60         }
 61         
else
 62             p = p->next;
 63     }
 64     
while(p!=NULL)
//
p!=NULL保证遍历到最后一个节点
 65 
    {
 66         p = p->next;
 67         q = q->next;
 68     }
 69     cout << q->data <<endl;
 70 }
 71 
void FindBackKthNode_2(List *L ,
int k)
 72 {
 73     
if(L == NULL)
 74         
return ;
 75     List *p = L->next;
 76     
int num = 
0;
 77     
while(p)
 78     {
 79         p = p->next;
 80         num++;
 81     }
 82     
if(num<k)
 83     {
 84         cout << 
"
K is too big
" << endl;
 85         
return ;
 86     }
 87     
else 
if(num == k)
 88     {
 89         p = L->next;
 90         cout << p->data << endl;
 91     }
//
这种方法的边界条件不好,需要加特殊判断
 92 
    
else 
if(num > k)
 93     {
 94         p = L;
//
注意此处要将头结点给p,不然下面的循环条件要改成num-k-1
 95 
        
for(
int i = 
0;i<num-k;i++)
 96         {
 97             p = p->next;
 98         }
 99         cout << p->data << endl;
100     }
101 }
102  
int main()
103  {
104      List *a = 
new List;
105      List *b = 
new List;
106      HeadCreatList(a);
107      TailCreatList(b);
108      DisPlay(a);
109      DisPlay(b);
110      FindBackKthNode_1(a,
5);
111      FindBackKthNode_2(b,
5);
112      system(
"
pause
");
113 
114      
return 
0;
115  }

 

转载于:https://www.cnblogs.com/xiawen/archive/2013/04/17/3026666.html

你可能感兴趣的文章
UVA 116 Unidirectional TSP (白书dp)
查看>>
第三方测速工具
查看>>
MySQL 网络访问连接
查看>>
在aws ec2上使用root用户登录
查看>>
数据访问 投票习题
查看>>
CIO知识储备
查看>>
cnblog!i'm coming!
查看>>
使用点符号代替溢出的文本
查看>>
Axios 中文说明
查看>>
fatal: remote origin already exists.
查看>>
gridview 自定义value值
查看>>
2018二月实现计划成果及其三月规划
查看>>
类名.class和getClass()区别
查看>>
12/17面试题
查看>>
javascript实现图片轮播3D效果
查看>>
ssl初一组周六模拟赛【2018.3.17】
查看>>
[RxJS] Avoid mulit post requests by using shareReplay()
查看>>
LeetCode 242. Valid Anagram
查看>>
JSP表单提交乱码
查看>>
如何适应现代雇佣关系
查看>>