寻找链表的中间节点
通常我们可能需要寻找链表的中间节点,但对于链表节点个数是偶数还是奇数有所不同。
如果链表节点个数是奇数个,则 L/2+1 是中间节点(如 {1, 2, 3} 中 2 是中间节点);如果链表节点个数是偶数个,则 L/2 和 L/2+1 都是中间节点(如 {1, 2, 3, 4} 中 2 和 3 都是中间节点)。
有两种思路:
- 第一种思路,先统计链表节点个数
L 。如果链表节点个数是奇数则第 L/2+1 个节点 是链表的中间节点;如果链表节点个数是偶数个,则 L/2 和 L/2+1 都是中间节点。 - 第二种思路,使用快慢指针的方式,快指针
fast 前进两步,慢指针 slow 前进一步,当快指针 fast 到达链表尾部时,慢指针 slow 刚好到达链表的中间。如果链表节点个数是奇数则 slow 是链表的中间节点;如果链表节点个数是偶数则 slow 和 slow->next 都是链表的中间节点。(注意,带头结点的单链表,初始情况下 fast 和 slow 都是从头结点开始的)
解法二图解:
解法一核心代码:
int findMid(LNode* list){
int len=0;
LNode* node=list->next;
while(node!=NULL){
len++;
node=node->next;
}
int num;
if(len%2==0){
num=len/2;
}else{
num=len/2+1;
}
int count=0;
node=list->next;
while(node!=NULL){
count++;
if(count==num){
break;
}
node=node->next;
}
return node->data;
}
解法二核心代码:
int findMid(LNode* list){
LNode* fast=list;
LNode* slow=list;
while(fast!=NULL&&fast->next!=NULL){
fast=fast->next->next;
slow=slow->next;
}
return slow->data;
}
完整代码:
#include <stdio.h>
#include <malloc.h>
typedef struct LNode {
int data;
struct LNode *next;
} LNode;
LNode *createByTail(LNode **list, int nums[], int n) {
*list = (LNode *) malloc(sizeof(LNode));
(*list)->next = NULL;
LNode *node = (*list);
for (int i = 0; i < n; i++) {
LNode *newNode = (LNode *) malloc(sizeof(LNode));
newNode->data = nums[i];
newNode->next = NULL;
node->next = newNode;
node = newNode;
}
return *list;
}
int findMid(LNode *list) {
LNode *fast = list;
LNode *slow = list;
while (fast != NULL && fast->next != NULL) {
fast = fast->next->next;
slow = slow->next;
}
return slow->data;
}
void print(LNode *list) {
printf("[");
LNode *node = list->next;
while (node != NULL) {
printf("%d", node->data);
if (node->next != NULL) {
printf(", ");
}
node = node->next;
}
printf("]\n");
}
int main() {
LNode *list1;
int nums1[] = {1, 2, 3, 4, 5};
int n1 = 5;
createByTail(&list1, nums1, n1);
print(list1);
int mid1 = findMid(list1);
printf("中间节点:%d\n", mid1);
LNode *list2;
int nums2[] = {1, 2, 3, 4, 5, 6};
int n2 = 6;
createByTail(&list2, nums2, n2);
print(list2);
int mid2 = findMid(list2);
printf("中间节点:%d\n", mid2);
}
|