C语言:【单链表】查找单链表的中间节点,要求只能遍历一次

原创 2016年05月30日 17:16:18
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>

typedef int DataType;

typedef struct SListNode
{
    DataType data;
    struct SListNode* next;
}SListNode;

SListNode* BuyNode(DataType x)
{
    SListNode* next = (SListNode*)malloc(sizeof(SListNode));
    next->data = x;
    next->next = NULL;
    return next;
}

void PushBack(SListNode* & ppHead, DataType x)
{
    if (ppHead == NULL)
    {
        ppHead = BuyNode(x);
    }
    else
    {
        SListNode* tail = ppHead;
        while (tail->next != NULL)
        {
            tail = tail->next;
        }
        tail->next = BuyNode(x);
    }
}
//查找单链表的中间节点,要求只能遍历一次
SListNode* FindMiddle(SListNode* ppHead)
{
    SListNode* slow = ppHead;
    SListNode* fast = ppHead;
    while (fast)
    {
        fast = fast->next;
        if (fast != NULL)
        {
            slow = slow->next;
            fast = fast->next;
        }
        else
        {
            return slow;
        }
    }
    return slow;
}
void PrintSNodeList(SListNode* ppHead)
{
    while (ppHead)
    {
        printf("%d->", ppHead->data);
        ppHead = ppHead->next;
    }
    printf("\n");
}

void Test3()
{
    SListNode* List = NULL;
    PushBack(List, 1);
    PushBack(List, 2);
    PushBack(List, 3);
    PushBack(List, 4);
    PushBack(List, 5);
    PrintSNodeList(List);
    SListNode *ret=FindMiddle(List);
    printf("%d ", ret->data);
}

int main()
{
    Test3();
    system("pause");
    return 0;
}


查找单链表的中间节点,要求只能遍历一次链表

思路:快慢指针 //查找单链表的中间节点,要求只能遍历一次链表 #include using namespace std; #include typedef int DataTyp...
  • qq1010234991
  • qq1010234991
  • 2016年04月30日 16:15
  • 269

一次遍历单向链表找到中间节点

一次遍历单向链表找到中间节点 具体方法和思想: 1)设置2个指针,一个走2步时,另一个走1步; 2)那么一个走到头时,另一个走到中间。 iNode * GetMiddleNode ( iNod...
  • guoyong10721073
  • guoyong10721073
  • 2012年11月03日 20:19
  • 3314

C语言--单链表创建、求长度、查找前驱结点、删除结点

#include #include //malloc需要此头文件 //定义单链表结点结构体 typedef int ElemType; typedef struct Node { El...
  • woailvmengmeng
  • woailvmengmeng
  • 2014年02月28日 09:33
  • 1791

C语言:单链表查找其中节点的数据

#include #include #define MAX 10 struct List { int number; int total; struct List *next; };...
  • wynter_
  • wynter_
  • 2016年09月10日 14:56
  • 2470

单链表查找倒数第K个节点

写一个函数,输出单链表的倒是第K个节点。 思路分析: 方法一:用两个指针,p1和p2,p1先将链表遍历一遍,得到链表的长度length,然后二者一起走,当p1指向length-k-1的时候,p2指...
  • keyue123
  • keyue123
  • 2013年10月25日 20:03
  • 1238

单链表操作之查找中间结点

***单链表操作之查找中间结点*** //查找链表的中间结点; //自定义的结点结构体和头指针结构体: #include #include #in...
  • bitboss
  • bitboss
  • 2016年06月08日 22:50
  • 1723

C语言实现单链表创建和遍历

创建单链表有多种方式,我这里介绍从尾部添加新节点的创建方式。 创建的过程: 1.定义节点的数据结构 c语言中链表节点是用结构体来实现,创建之前要明白数据域需要什么类型的数据。例如: //定义链表中...
  • qlzx_syzx
  • qlzx_syzx
  • 2016年07月28日 15:58
  • 5666

C语言实现单链表的逆序打印(带头结点)

我在之前一篇博客《C语言实现单链表(不带头结点)的逆序打印》中详细实现了对一个不带头节点的链表的逆序打印,整体思路也是非常的简单,也就是依次遍历原链表,然后把取出的节点用头插法建立一个新的链表,新链表...
  • CHENYUFENG1991
  • CHENYUFENG1991
  • 2016年03月01日 20:07
  • 3458

C语言实现单链表(带头结点)的基本操作

我在之前一篇博客《C语言实现单链表(不带头结点)的基本操作》中具体实现了不带头结点的单链表的11种操作:如计算链表长度、初始化、创建链表、清空链表等等。但是在实际使用中,带头结点的单链表往往比不带头结...
  • CHENYUFENG1991
  • CHENYUFENG1991
  • 2016年03月01日 13:40
  • 5509

面试题——查找单链表的中间节点

链表是基本的数据结构之一,面试题中链表占很大一部分,可见链表操作是非常重要的。我对一些常见的链表操作进行的归纳。        下面的问题为:查找单链表的中间节点。题目分析:       链表的特点就...
  • ttyue_123
  • ttyue_123
  • 2016年08月09日 21:42
  • 2333
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C语言:【单链表】查找单链表的中间节点,要求只能遍历一次
举报原因:
原因补充:

(最多只允许输入30个字)