一、结构体定义:
typedef int DataType;
typedef struct ListNode//定义结点
{
DataType data;
struct ListNode* next;
}ListNode,*PListNode;
typedef struct PList//定义一个成员是指向结点的指针的结构体
{
PListNode PHead;
}PList,*PList;
二、函数实现:
方法一:方法1(计数法)—遍历两遍
//4.查找链表的中间节点---方法1(计数法)---遍历两遍
PListNode FindMidNode1(PList PList)
{
int count=0;
int mid=0;
PListNode cur;
assert(PList);
cur=PList->PHead;
if (PList->PHead==NULL||PList->PHead->next==NULL)//如果链表为空或者链表只有一个结点
{
return PList->PHead;//返回第一个结点(空||结点)
}
else//链表结点超过一个
{
while (cur)
{
count++;
cur=cur->next;
}
printf("链表结点个数为:%d",count);
mid=count/2;
cur=PList->PHead;
while (mid)
{
mid--;
cur=cur->next;
}
return cur;
}
}
方法二:方法2(快慢指针法)—遍历一遍
思路:慢指针每一次走一步,快指针每次走两步,快指针走到尾时,慢指针正好走到中间
//4查找单链表的中间节点---方法2(快慢指针法)---遍历一遍
PListNode FindMidNode2(PList PList)
{
PListNode fast=NULL;
PListNode slow=NULL;
assert(PList);
fast=PList->PHead;
slow=PList->PHead;
while (fast!=NULL&&fast->next!=NULL)//防止对空指针的访问操作
{
fast=fast->next->next;
slow=slow->next;
}
return slow;
}