题目表述:
1.设计一个算法,找出一个无环的单链表里面倒数第k个元素,速度要快。
2.设计一个算法,找出一个无环的单链表里中间元素
1.算法实现:
实现中的注释已经解释了算法的大概思想。
- struct node{
- int key;
- node* next;
- };
- typedef node* List;
- int findLastKthElement(List list, int k)
- {
- //遍历整个链表,
- //声明一个临时指针指向头节点
- //当遍历过元素个数小于K的时候,继续遍历
- //当遍历过的元素个数等于k的时候,临时指针指向下一个元素,然后继续遍历
- //当遍历到链表尾部的时候,则临时指针指向的节点就为倒数第k个元素。
- if (list == NULL || k <= 0)
- {
- return -1; //查找失败。
- }
- List p = list;
- List tempList = list;
- int num = 0;
- while(p)
- {
- if (num < k)
- {
- num++;
- }
- else if (num == k)
- {
- tempList = tempList->next;
- }
- p = p->next;
- }
- if (num < k)
- {
- return -1; //查找倒数第k个元素失败
- }
- return tempList->key;
- }
2.其实这类问题都可以设置两个指针,比如二个问题,可以设置两个指针,同时从头开始遍历,一个快指针同时走两步,一个慢指针一次走一步,当快指针走到尾部时,则慢指针就到中间了。
1
10
11
12
13
14
15
16
17
18
19
20
21
22
23