题目表述:
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 ListNode* find_midlist(ListNode* head)
2 {
3 ListNode *p1, *p2;
4
5 if (head == NULL || head->next == NULL)
6 {
7 return head;
8 }
9 p1 = p2 = head;
10 while (1)
11 {
12 if (p2->next != NULL && p2->next->next != NULL)
13 {
14 p2 = p2->next->next;
15 p1 = p1->next;
16 }
17 else
18 {
19 break;
20 }
21 }
22 return p1;
23 }