目录
一、思路
二、代码
三、测试
四、总结
先上关键代码
LinkList front_Node = L->next; LinkList later_Node = L->next; while(front_Node->next != NULL) { if(front_Node->next->next !=NULL) front_Node = front_Node->next->next; else break; //注意break的位置 later_Node = later_Node->next; } return later_Node;用两个指针,分别是快指针和慢指针,让他们同时出发,不同的是快指针一次前进两个结点,慢指针则前进一个,这样当快指针到达尾结点时,慢指针也到达中间结点。不过其中有些细节我们需要注意。
①当结点个数是奇数时,没有什么问题,图示如下
②当结点个数是偶数时,要注意边界问题,我们及早判断到达终点,跳出循环,图示如下
LinkList front_Node = L->next; LinkList later_Node = L->next; while(front_Node->next != NULL) { if(front_Node->next->next !=NULL) front_Node = front_Node->next->next; else break; later_Node = later_Node->next; } return later_Node; }这里我用到了一个if判断加上一个break语句,这个break的位置,其实就影响了中间结点是偏左,还是偏右那个结点,这给我们了一些灵活性,这里我们break在前,所以是偏左则,完全可以改成右侧,只需要移动慢指针到上面即可。以下是右侧代码
LinkList front_Node = L->next; LinkList later_Node = L->next; while(front_Node->next != NULL) { later_Node = later_Node->next; if(front_Node->next->next != NULL) front_Node = front_Node->next->next; else break; } return later_Node;
这里我们规定当结点个数为偶数时,返回偏左侧结点值
1 1 该链表的元素个数为:1 1 中间结点值为:1 2 1 2 该链表的元素个数为:2 1 2 中间结点值为:1 3 1 2 3 该链表的元素个数为:3 1 2 3 中间结点值为:2 4 1 2 3 4 该链表的元素个数为:4 1 2 3 4 中间结点值为:2 5 1 2 3 4 5 该链表的元素个数为:5 1 2 3 4 5 中间结点值为:3 10 1 2 3 4 5 6 7 8 9 10 该链表的元素个数为:10 1 2 3 4 5 6 7 8 9 10 中间结点值为:5这里我们规定当结点个数为偶数时,返回偏右侧结点值
1 1 该链表的元素个数为:1 1 中间结点值为:1 2 1 2 该链表的元素个数为:2 1 2 中间结点值为:2 3 1 2 3 该链表的元素个数为:3 1 2 3 中间结点值为:2 4 1 2 3 4 该链表的元素个数为:4 1 2 3 4 中间结点值为:3 5 1 2 3 4 5 该链表的元素个数为:5 1 2 3 4 5 中间结点值为:3 10 1 2 3 4 5 6 7 8 9 10 该链表的元素个数为:10 1 2 3 4 5 6 7 8 9 10 中间结点值为:6这里用到了一个数学的小技巧,即奇数 * 2 = 偶数,数学无处不在。