//自定义的结点结构体和头指针结构体:
- #include<stdio.h>
- #include<assert.h>
- #include<stdlib.h>
- #include<string.h>
-
- typedef int DataType;
-
- typedef struct LinkNode
- {
- DataType data;
- struct LinkNode* next;
- }LinkNode,*pLinkNode;
-
- typedef struct LinkList
- {
- LinkNode* pHead;
- }LinkList ,*pLinkList;
//函数原型:pLinkNode FindMidNode(pLinkList pList);
/* 思路分析:要找的链表的中间结点,我在这里的解法用到的是快慢指针;定义两个指针,都指向链表的第一个成员,然后快的指针每次走两步,慢的指针每次走一步,当快指针指向的next为NULL即链表结点为奇数个的时候,或者,快指针快指针自身为空的时候停下,即链表元素为偶数个,此时的慢指针走了s步,则快指针走了2s步,则此时 慢指针所指向的结点为中间节点;
//这道题比较简单,理解起来也容易,但是关于快慢指针的应用才是重点,后续的文章会讲到链表的带环问题,会对快慢指针进行再次的应用,就比较难理解了!
//算法代码实现:
- pLinkNode FindMidNode(pLinkList pList)
- {
- pLinkNode fast = NULL ;
- pLinkNode slow = NULL;
- assert(pList);
-
- fast = slow = pList ->pHead ;
-
- while(fast && fast->next )
- {
- fast = fast->next ->next ;
- slow = slow->next;
- }
- return slow;
- }
//自定义的结点结构体和头指针结构体:
- #include<stdio.h>
- #include<assert.h>
- #include<stdlib.h>
- #include<string.h>
-
- typedef int DataType;
-
- typedef struct LinkNode
- {
- DataType data;
- struct LinkNode* next;
- }LinkNode,*pLinkNode;
-
- typedef struct LinkList
- {
- LinkNode* pHead;
- }LinkList ,*pLinkList;
//函数原型:pLinkNode FindMidNode(pLinkList pList);
/* 思路分析:要找的链表的中间结点,我在这里的解法用到的是快慢指针;定义两个指针,都指向链表的第一个成员,然后快的指针每次走两步,慢的指针每次走一步,当快指针指向的next为NULL即链表结点为奇数个的时候,或者,快指针快指针自身为空的时候停下,即链表元素为偶数个,此时的慢指针走了s步,则快指针走了2s步,则此时 慢指针所指向的结点为中间节点;
//这道题比较简单,理解起来也容易,但是关于快慢指针的应用才是重点,后续的文章会讲到链表的带环问题,会对快慢指针进行再次的应用,就比较难理解了!
//算法代码实现:
- pLinkNode FindMidNode(pLinkList pList)
- {
- pLinkNode fast = NULL ;
- pLinkNode slow = NULL;
- assert(pList);
-
- fast = slow = pList ->pHead ;
-
- while(fast && fast->next )
- {
- fast = fast->next ->next ;
- slow = slow->next;
- }
- return slow;
- }