【数据结构】单链表—链表中倒数第K个结点 — 快慢指针
2016-07-26 11:40
423 查看
输入一个链表,输出该链表中倒数第K个结点。注:链表的尾结点是倒数第一个结点。
思路一:
遍历一遍链表,求出链表的长度。
正数 = 长度 - 倒数 + 1
如图所示:
然后遍历正数的次数,便得到了倒数第K个结点。但是这种方法需要遍历链表两次。
思路二:
遍历一次可以用快慢指针解法,即定义两个指针,快指针和慢指针,求倒数第K个:结点快指针先走K-1步,然后快慢指针一起走当快指针走到结尾,慢指针所指向的就是所求结点。
代码如下:
思路一:
遍历一遍链表,求出链表的长度。
正数 = 长度 - 倒数 + 1
如图所示:
然后遍历正数的次数,便得到了倒数第K个结点。但是这种方法需要遍历链表两次。
思路二:
遍历一次可以用快慢指针解法,即定义两个指针,快指针和慢指针,求倒数第K个:结点快指针先走K-1步,然后快慢指针一起走当快指针走到结尾,慢指针所指向的就是所求结点。
代码如下:
template<class T> struct ListNode { T _value; ListNode<T>* _next; ListNode(const T& value) :_value(value) ,_next(NULL) {} }; template<class T> class List { public: List() :_head(NULL) {} bool PushBack(); ListNode<T>* FindLastKNode(int K)//寻找链表中倒数第K个节点,快慢指针,快指针先走K-1步,然后一起走直到快指针走到结尾慢指针指向的便是倒数第K个节点 { int len = Length(); if(K<=0 || K>len) { cout<<"输入无效,重新输入"<<endl; return NULL; } ListNode<T>* fast = _head; ListNode<T>* slow = _head; while(fast!=NULL && K--) { fast = fast->_next; } while(fast != NULL)//如果条件是fast->_next!=NULL则最后一个节点便是倒数第0个。。。。 { slow = slow->_next; fast = fast->_next; } return slow; } private: ListNode<T>* _head; };
相关文章推荐
- C#数据结构之顺序表(SeqList)实例详解
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#实现单链表(线性表)完整实例
- C#定义并实现单链表实例解析
- C#数据结构之单链表(LinkList)实例详解
- 数据结构之Treap详解
- C语言实现单链表逆序与逆序输出实例
- 用C语言举例讲解数据结构中的算法复杂度结与顺序表
- C#数据结构之堆栈(Stack)实例详解
- C语言单链表常见操作汇总
- C#数据结构之双向链表(DbLinkList)实例详解
- JavaScript数据结构和算法之图和图算法
- Java数据结构及算法实例:冒泡排序 Bubble Sort
- C数据结构之单链表详细示例分析
- Java数据结构及算法实例:插入排序 Insertion Sort
- Java数据结构及算法实例:考拉兹猜想 Collatz Conjecture
- 【数据结构与算法】数组应用4:多项式计算Java版