只遍历一次查找单链表的中间元素

如果没有限制的话,通常可以使用遍历一次单链表然后返回到链表长度再根据是奇数还是偶数来处理。

这里利用两个指针来处理,一个快指针一个慢指针,快指针一次走两步,慢指针一次走一步,当单链表为奇数时,快指针的下一个为NULL,直接取慢指针的内容。

当单链表为偶数时,快指针的下下一个指针为NULL,这个时候取慢指针和慢指针的下一个数的和作为中间数

 

 1 #define _CRT_SECURE_NO_WARNINGS
 2 #include<stdio.h>
 3 typedef struct node {
 4     int a;
 5     struct node* next;
 6 }NODE;
 7 double test01()
 8 {
 9     NODE a1, a2, a3, a4, a5;
10     a1 = { 1,&a2 };
11     a2 = { 22,&a3 };
12     a3 = { 3,&a4 };
13     a4 = { 44,&a5 };
14     a5 = { 5,NULL };
15     //奇链表
16     NODE* quick = &a1;
17     NODE *slow = &a1;
18     double sum;
19     while (1)
20     {
21         if (quick->next == NULL)
22         {
23             sum  = slow->a;
24             break;
25         }
26         if (quick->next->next == NULL)
27         {
28             sum = (slow->a + slow->next->a) / (2.0);
29         }
30         quick = quick->next;
31         quick = quick->next;
32         slow = slow->next;
33     }
34     return sum;
35 }
36 double test02()
37 {
38     NODE a1, a2, a3, a4, a5,a6;
39     a1 = { 1,&a2 };
40     a2 = { 22,&a3 };
41     a3 = { 3,&a4 };
42     a4 = { 44,&a5 };
43     a5 = { 5,&a6 };
44     a6 = { 66,NULL };
45     //偶链表
46     NODE* quick = &a1;
47     NODE* slow = &a1;
48     double sum;
49     while (1)
50     {
51         if (quick->next == NULL)
52         {
53             sum = slow->a;
54             break;
55         }
56         if (quick->next->next == NULL)
57         {
58             sum = (slow->a + slow->next->a) / 2.0;
59             break;
60         }
61         quick = quick->next;
62         quick = quick->next;
63         slow = slow->next;
64     }
65     return sum;
66 }
67 
68 
69 
70 int main()
71 {
72     int ret;
73     ret =  test01();
74     printf("在test01中的中间链表值为%ld", ret);
75     ret =  test02();
76     printf("在test02中的中间链表值为%ld", ret);
77     return 0;
78 }