目录
思路:
利用快慢指针,
设置两个指针,*search,*mid;
让两个指针都指向单链表的首节点;
*search的移动速度是*mid的两倍,当search指向单链表的尾节点时,mid指向中间节点。
改错:
01.
int GetMidNode(struct student *head,int e){
struct student * search;
struct student *mid;
search=head->next;
mid=head->next;
if(search->next!=NULL){
//让search的移动速度是mid 的两倍
search=search->next->next;
mid=mid->next;
} else{
search=search->next;
}
e=mid->data;
return e;
}
分析:
传递的参数int e
并没有被使用来存储中间节点的data,因为在GetMidNode
函数中并没有修改该参数的值。
代码中,中间节点的data应该通过函数的返回值来获取,而不是通过参数传递。通过将GetMidNode
函数的返回类型改为struct student*
,可以直接返回中间节点的指针,然后在主函数中打印中间节点的data。
改正:
struct student* GetMidNode(struct student* head) {
struct student* search;
struct student* mid;
search = head->next;
mid = head->next;
while (search != NULL && search->next != NULL) {
// 让search的移动速度是mid的两倍
search = search->next->next;
mid = mid->next;
}
return mid;
}
int main() {
struct student* midNode = GetMidNode(head);
if (midNode != NULL)
printf("该单链表中间节点的data: %d\n", midNode->data);
}
02.代码:
#include "stdio.h"
#include "malloc.h"
struct student {
int data;//放数据
struct student *next;//放地址
};
struct student *createList();
void printList(struct student *head);
struct student * GetMidNode(struct student *head);
main(){
struct student *head;
head=createList();
printList(head);
struct student* midNode = GetMidNode(head);
if (midNode != NULL)
printf("该单链表中间节点的data: %d\n", midNode->data);
}
struct student *createList(){
//创建一个单链表
struct student *p;//指向新建节点
struct student *q;//指向当前链表的最后一个节点
struct student *head;
int data;
head=(struct student *)malloc(sizeof(struct student));
head->next=NULL;
q=head;
scanf("%d",&data);
while(data!=0){
p=(struct student *)malloc(sizeof(struct student));
p->data=data;
//标准插入,将p插入到q之后
p->next=q->next;
q->next=p;
//指针后移
q=q->next;
scanf("%d",&data);
}
return head;
}
void printList(struct student *head){
//打印链表
struct student *phead;
phead=head->next;
while(phead!=NULL){
printf("%4d",phead->data);
phead=phead->next;
}
printf("\n");
}
struct student * GetMidNode(struct student *head){
//找到链表的中间节点
struct student * search;
struct student *mid;
//让两个指针都指向链表的首节点
search=head->next;
mid=head->next;
if(search->next!=NULL){
//让search的移动速度是mid 的两倍
search=search->next->next;
mid=mid->next;
} else{
search=search->next;
}
return mid;
}
改正:
struct student * GetMidNode(struct student *head){
struct student * search;
struct student *mid;
search=head->next;
mid=head->next;
//让search的移动速度是mid 的两倍
while (search != NULL && search->next != NULL) {
search = search->next->next;
mid = mid->next;
}
return mid;
}
这个算法的关键在于判断条件search != NULL && search->next != NULL
。这个条件确保了在移动指针的过程中,我们不会越界访问链表。
终极代码:
#include "stdio.h"
#include "malloc.h"
struct student {
int data;
struct student *next;
};
struct student *createList();
void printList(struct student *head);
struct student * GetMidNode(struct student *head);
main(){
struct student *head;
head=createList();
printList(head);
struct student* midNode = GetMidNode(head);
if (midNode != NULL)
printf("该单链表中间节点的data: %d\n", midNode->data);
}
struct student *createList(){
struct student *p;
struct student *q;
struct student *head;
int data;
head=(struct student *)malloc(sizeof(struct student));
head->next=NULL;
q=head;
scanf("%d",&data);
while(data!=0){
p=(struct student *)malloc(sizeof(struct student));
p->data=data;
p->next=q->next;
q->next=p;
q=q->next;
scanf("%d",&data);
}
return head;
}
void printList(struct student *head){
struct student *phead;
phead=head->next;
while(phead!=NULL){
printf("%4d",phead->data);
phead=phead->next;
}
printf("\n");
}
struct student * GetMidNode(struct student *head){
struct student * search;
struct student *mid;
search=head->next;
mid=head->next;
//让search的移动速度是mid 的两倍
while (search != NULL && search->next != NULL) {
search = search->next->next;
mid = mid->next;
}
return mid;
}