求链表中间结点

Posted wangchaomahan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求链表中间结点相关的知识,希望对你有一定的参考价值。

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 /*
 4 查找链表中间的结点。
 5 思路1:求长度:中间结点 = len/2
 6 思路2:定义两个指针p1,p2指向头结点,p1走一步,p2走两步,当p2指向尾结点的下一个结点的时候,p1指向中间结点。
 7        疑问:比如链表有5个结点,那么第3个是中间结点毫无疑问,但是如果6个结点,那么第3个算中间结点,还是第4个算中间结点呢?
 8 */
 9 typedef struct node
10  {
11      int data;
12       struct node * next;
13  }NODE;
14  NODE * createList()
15 {
16      NODE * head = (NODE *)malloc(sizeof(NODE));
17      head->next = NULL;
18  
19      return head;
20  }
21  void insertNode(NODE *head,int insertData)
22  {
23      NODE * sur = (NODE *)malloc(sizeof(NODE));
24      sur->data = insertData;
25 
26      sur->next = head->next;
27      head->next = sur;
28  
29  }
30  void traverList(NODE *head)
31  {
32      int i = 1;
33      head = head->next;
34      while(head)
35      {
36          printf("第%d结点 = %d
",i,head->data);
37         head = head->next;
38          i++;
39     }
40  }
41  NODE *middleList(NODE *head)
42  {
43      NODE *p1,*p2;
44      p1 = p2 = head;
45      while(p2)
46      {
47         p1 = p1->next;
48         p2 = p2->next;
49         if(p2 !=NULL)
50             p2 = p2->next;
51 
52      }
53      return p1;
54  }
55  int main(void)
56  {
57      NODE *head = createList();
58      for(int i = 0;i<5;i++)
59          insertNode(head,rand()%100);
60      traverList(head);
61      NODE * p1 = middleList(head);
62      printf("中间结点数据 = %d
",p1->data);
63      return 0;
64  }

 

以上是关于求链表中间结点的主要内容,如果未能解决你的问题,请参考以下文章

各种求链表中间节点

各种求链表中间节点

头插法链表的基本操作:创建空链表,插入结点,遍历链表,求链表长度,查找结点,删除结点

5种常见的链表基本操作

算法热门:链表中倒数第k个结点(剑指Offer 22)

习题3.5 求链表的倒数第m个元素(20 分)浙大版《数据结构(第2版)》题目集