[面试备忘]链表环判断,不同链表是否有交点判断

题目: 链表环判断,不同链表是否有交点判断

View Code
 1 #include <iostream>
2 #include <cassert>
3
4 typedef struct __node {
5 int value;
6 __node* next;
7 } NODE, *PNODE;
8
9 bool circleJudge(const PNODE head)
10 {
11 assert(head);
12 PNODE oneOffset = head, twoOffset = head->next;
13 while (true) {
14 if (!oneOffset || !twoOffset || !twoOffset->next || oneOffset == twoOffset) {
15 break;
16 }
17 oneOffset = oneOffset->next;
18 twoOffset = twoOffset->next->next;
19 }
20 return oneOffset == twoOffset;
21 }
22
23 bool sameNode(PNODE preHead, PNODE postHead)
24 {
25 assert(preHead && postHead);
26 PNODE preTail = preHead;
27 while (preTail->next != NULL) {
28 preTail = preTail->next;
29 }
30 preTail->next = postHead;
31 bool result = circleJudge(preHead);
32 preTail = NULL;
33 return result;
34 }
35
36 int main()
37 {
38 PNODE head = new NODE();
39 head->value = 0;
40 head->next = NULL;
41 PNODE tail = head;
42 PNODE circlePoint = NULL;
43 for (int index = 1; index != 11; ++index) {
44 PNODE temp = new NODE();
45 temp->value = index;
46 temp->next = NULL;
47 tail->next = temp;
48 tail = temp;
49 if (index == 5) {
50 circlePoint = temp;
51 }
52 }
53 PNODE postHead = new NODE();
54 postHead->value = 0;
55 postHead->next = NULL;
56 PNODE postTail = postHead;
57 for (int index = 1; index != 11; ++index) {
58 PNODE temp = new NODE();
59 temp->value = index;
60 temp->next = NULL;
61 postTail->next = temp;
62 postTail = temp;
63 if (index == 10) {
64 temp->next = circlePoint;
65 }
66 }
67 std::cout << std::boolalpha << sameNode(head, postHead) << std::endl;
68 return 0;
69 }

  

环判断: 用两个指针便利链表, 一个每次前进一个元素,另一个前进两个, 循环到尾结点或两指针相等结束遍历, 返回两指针是否相等.

交点判断: 将一个链表的尾与另一个的头暂时联结起来, 判断这个新的链表是否有环.

 

posted @ 2011-08-29 00:06  lifengzhong  阅读(226)  评论(0编辑  收藏  举报