算法题:求链表倒数第K个结点
2014-08-04 13:34
225 查看
说明:本文仅供学习交流,转载请标明出处,欢迎转载!
题目:给出一个单链表,返回倒数第K个结点,最后一个结点为倒数第1个。
《剑指offer》上面给的解法是设置两个指针,这里记为p1、p2,先让p2走(k-1)步,然后p1、p2同时走,当p2走到最后一个结点时,p1所指向的结点就是倒数第k个结点。
我觉得按照这样的逻辑写代码反而更容易出错,因为我们需要把我两件重要的问题:(1).p2先走(k-1)步;(2)循环结束的条件是p2到达最后一个结点,即p2->next==NULL。显然这样不太容易控制,我的想法是:先让p2先走k步,然后p1,p2一块走,循环结束的条件是p2到达NULL,即p2==NULL,这样比较直观。
我们用Node *FindLastK(Node *head,int k)表示求解函数,同时在要注意以下特殊情况:
(1)处理空链表的情况,即head=NULL的情况;
(2)处理k<1的情况;(注意k从1开始)
(3)处理链表长度小于k的情况。
代码如下:
测试结果如下:
参考资料------《剑指offer》
题目:给出一个单链表,返回倒数第K个结点,最后一个结点为倒数第1个。
《剑指offer》上面给的解法是设置两个指针,这里记为p1、p2,先让p2走(k-1)步,然后p1、p2同时走,当p2走到最后一个结点时,p1所指向的结点就是倒数第k个结点。
我觉得按照这样的逻辑写代码反而更容易出错,因为我们需要把我两件重要的问题:(1).p2先走(k-1)步;(2)循环结束的条件是p2到达最后一个结点,即p2->next==NULL。显然这样不太容易控制,我的想法是:先让p2先走k步,然后p1,p2一块走,循环结束的条件是p2到达NULL,即p2==NULL,这样比较直观。
我们用Node *FindLastK(Node *head,int k)表示求解函数,同时在要注意以下特殊情况:
(1)处理空链表的情况,即head=NULL的情况;
(2)处理k<1的情况;(注意k从1开始)
(3)处理链表长度小于k的情况。
代码如下:
#include<iostream> using namespace std; struct Node { int value; Node* next; Node(int v):value(v){} }; /*创建一个链表,1->2->3->4->5->6->7*/ Node* CreateList()//创建一个单链表 { Node *head; Node *n1=new Node(1); Node *n2=new Node(2); Node *n3=new Node(3); Node *n4=new Node(4); Node *n5=new Node(5); Node *n6=new Node(6); Node *n7=new Node(7); head=n1; n1->next=n2; n2->next=n3; n3->next=n4; n4->next=n5; n5->next=n6; n6->next=n7; n7->next=NULL; return head; } void FreeList(Node *head)//将链表空间释放 { if(head==NULL) { return ; } else { Node *temp=head->next; delete head; head=temp; FreeList(head); } } void VisitList(Node *head)//遍历链表中的元素,用递归的方法遍历 { if(head) { cout<<head->value<<"->"; VisitList(head->next); } else { cout<<"null"<<endl; } } Node *FindLastK(Node *head,int k)//查找倒数第K个元素,最后一个元素时倒数第一个 { if(head==NULL || k<1) { return NULL; } else { Node *pre,*p; pre=p=head; int i; for(i=0;p && i<k;i++)//要保证p存在,p先走k步 { p=p->next; } if(i<k)//说明没走到k步,即k大于链表的长度 { return NULL; } else//如果一切正常,则两者同时走 { while(p) { p=p->next; pre=pre->next; } } return pre; } } int main() { Node *head=CreateList(); cout<<"链表输出为:"; VisitList(head); int k; while(cin>>k) { Node *temp=FindLastK(head,k); if(temp) { cout<<"倒数第"<<k<<"个元素为:"<<temp->value<<endl; } else { cout<<"输入的K超过了链表的长度!"<<endl; } } FreeList(head);//释放链表空间 return 0; }
测试结果如下:
参考资料------《剑指offer》
相关文章推荐
- 面试算法(十四)链表中倒数第k个结点
- 剑指offer-算法题练习:part16 链表中倒数第k个结点
- 每天一道算法题——链表中倒数第k个结点
- 算法题9 查找链表中倒数第k个结点
- 算法学习五---输出链表中倒数第k个结点
- 每天一道算法题7 查找链表中倒数第k个结点 ; 输入一个单向链表。如果该链表的结点数为奇数,输出中间的结点;如果链表结点数为偶数,输出中间两个结点前面的一个
- 【算法】求链表中倒数第K个结点
- 每天一道算法题7 查找链表中倒数第k个结点
- 算法题目---链表中倒数第k个结点
- 每天一个算法之链表中倒数第K个结点
- 每天学习一算法系列(13) (输入一个单向链表,输出该链表中倒数第k个结点)
- 【经典算法】: 求链表中倒数第K个结点
- 算法-获取链表中倒数第k个结点
- 每天一个小算法(5)----找到链表倒数第K个结点
- [算法]在单链表和双链表中删除倒数第k个结点
- 微软算法100道题------输入一个单向链表,输出该链表中倒数第k个结点。链表的倒数第0个结点为链表的尾指针
- 数据结构——算法之(004)(输入一个单向链表,输出该链表中倒数第k个结点)
- 重拾算法之剑指Offier——链表中倒数第k个结点
- 剑指offer 链表中倒数第k个结点
- 面试题15: 链表中倒数第k个结点