C 带头节点的单链表查找中间节点

来源:互联网 发布:义乌淘宝营销培训 编辑:程序博客网 时间:2024/05/16 12:45


//自定义的结点结构体和头指针结构体:

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. #include<stdio.h>  
  2. #include<assert.h>  
  3. #include<stdlib.h>  
  4. #include<string.h>  
  5.   
  6. typedef int DataType;  
  7.   
  8. typedef struct LinkNode  
  9. {  
  10.     DataType data;  
  11.     struct LinkNode* next;  
  12. }LinkNode,*pLinkNode;//结点结构体  
  13.   
  14. typedef struct LinkList  
  15. {  
  16.     LinkNode* pHead;//头结点指针  
  17. }LinkList ,*pLinkList;//链表  


//函数原型:pLinkNode  FindMidNode(pLinkList pList);


/* 思路分析:要找的链表的中间结点,我在这里的解法用到的是快慢指针;定义两个指针,都指向链表的第一个成员,然后快的指针每次走两步,慢的指针每次走一步,当快指针指向的next为NULL即链表结点为奇数个的时候,或者,快指针快指针自身为空的时候停下,即链表元素为偶数个,此时的慢指针走了s步,则快指针走了2s步,则此时 慢指针所指向的结点为中间节点;

//这道题比较简单,理解起来也容易,但是关于快慢指针的应用才是重点,后续的文章会讲到链表的带环问题,会对快慢指针进行再次的应用,就比较难理解了!

//算法代码实现:

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. pLinkNode  FindMidNode(pLinkList pList)  
  2. {  
  3.     pLinkNode fast = NULL ;  
  4.     pLinkNode slow = NULL;  
  5.     assert(pList);  
  6.   
  7.     fast = slow = pList ->pHead ;  
  8.       
  9.     while(fast && fast->next )  
  10.     {  
  11.         fast = fast->next ->next ;  
  12.         slow = slow->next;  
  13.     }  
  14.     return slow;  
  15. }  
//自定义的结点结构体和头指针结构体:

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. #include<stdio.h>  
  2. #include<assert.h>  
  3. #include<stdlib.h>  
  4. #include<string.h>  
  5.   
  6. typedef int DataType;  
  7.   
  8. typedef struct LinkNode  
  9. {  
  10.     DataType data;  
  11.     struct LinkNode* next;  
  12. }LinkNode,*pLinkNode;//结点结构体  
  13.   
  14. typedef struct LinkList  
  15. {  
  16.     LinkNode* pHead;//头结点指针  
  17. }LinkList ,*pLinkList;//链表  


//函数原型:pLinkNode  FindMidNode(pLinkList pList);


/* 思路分析:要找的链表的中间结点,我在这里的解法用到的是快慢指针;定义两个指针,都指向链表的第一个成员,然后快的指针每次走两步,慢的指针每次走一步,当快指针指向的next为NULL即链表结点为奇数个的时候,或者,快指针快指针自身为空的时候停下,即链表元素为偶数个,此时的慢指针走了s步,则快指针走了2s步,则此时 慢指针所指向的结点为中间节点;

//这道题比较简单,理解起来也容易,但是关于快慢指针的应用才是重点,后续的文章会讲到链表的带环问题,会对快慢指针进行再次的应用,就比较难理解了!

//算法代码实现:

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. pLinkNode  FindMidNode(pLinkList pList)  
  2. {  
  3.     pLinkNode fast = NULL ;  
  4.     pLinkNode slow = NULL;  
  5.     assert(pList);  
  6.   
  7.     fast = slow = pList ->pHead ;  
  8.       
  9.     while(fast && fast->next )  
  10.     {  
  11.         fast = fast->next ->next ;  
  12.         slow = slow->next;  
  13.     }  
  14.     return slow;  
  15. }  
0 0