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

#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;
}
时间: 2024-07-30 10:08:42

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

查找单链表的倒数第k个值

刚开始,我想到的是一种笨方法,先遍历单链表,计算出单链表的长度len,然后再从头遍历单链表到第len-k个节点,那么 这个节点既是单链表的倒数第k个节点. 不过这种算法时间复杂度挺高的,还有一种更简单的方法,就是设置两个指针,分别指向单链表的头节点,然后让其中一个指针,先走k步, 之后,再让两个指针同时走,直到第一个指针走到单链表尾节点结束. 那么,第二个指针所指向的节点,就是倒数第k个节点. 代码如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1

单链表查找最大值、两个递增的链表合并并且去重

单链表查找最大值 代码: 1 #include<iostream> 2 #include<bits/stdc++.h> 3 using namespace std; 4 struct Node{ 5 int value; 6 Node * next; 7 }; 8 Node *a=new Node; //创建头指针 9 void build_link(Node * a,int n){ //建表 10 Node *p; 11 p=a; 12 for(int i=0;i<n;i+

【数据结构-链表】单链表

链表 特点 链表是通过任意的存储单元来存储线性表中的数据元素 链表组成 链表是由很对节点组成 带有头结点的单链表 typedef struct{ struct node *head;//链表的头结点 }LinkList; 节点结构 typedef struct node{ int data; struct node *next; }Node; 链表的插入操作 首先得到插入位置的节点n 得到插入位置的前一个节点pre 讲新插入的节点的next指针指向n pre节点的next指向n /** * 在p

Python与数据结构[0] -&gt; 链表[0] -&gt; 单链表与带表头单链表的 Python 实现

单链表 / Linked List 目录 单链表 带表头单链表 链表是一种基本的线性数据结构,在C语言中,这种数据结构通过指针实现,由于存储空间不要求连续性,因此插入和删除操作将变得十分快速.下面将利用Python来完成单链表的实现. 1 单链表 不带表头的单链表通常形式如下, node_1 -> node_2 -> node_3 -> node_4 完整代码 1 class Node: 2 def __init__(self, val=None, nxt=None): 3 self.v

深度解析(三)数组、单链表和双链表

数组.单链表和双链表介绍 以及 双向链表的C/C++/Java实现 概要 线性表是一种线性结构,它是具有相同类型的n(n≥0)个数据元素组成的有限序列.本章先介绍线性表的几个基本组成部分:数组.单向链表.双向链表:随后给出双向链表的C.C++和Java三种语言的实现.内容包括:数组单向链表双向链表1. C实现双链表2. C++实现双链表3. Java实现双链表 数组 数组有上界和下界,数组的元素在上下界内是连续的. 存储10,20,30,40,50的数组的示意图如下: 数组的特点是:数据是连续的

单链表,双链表,循环链表的区别

单向链表(单链表) 单向链表,它包含两个域,一个信息域和一个指针域.这个链接指向表中的下一个节点,而最后一个节点则 指向一个空值NULL. 单向链表只可向一个方向遍历. 查找一个节点的时候需要从第一个节点开始每次访问下一个节点,一直访问到需要的位置.也可以提前把一个节点的位置另外保存起来,然后直接访问. 双向链表,(双链表) 双向链表中不仅有指向后一个节点的指针,还有指向前一个节点的指针.第一个节点的"前连接"指向NULL,最后一个节点的"后连接"指向NULL. 这

数据结构 链表_单链表的接口定义

链表可以说是一种最为基础的数据结构.链表由一组元素以一种特定的顺序组合或链接而成,在维护数据的集合时很有用.这一点同我们常用的数组很相似.然而,链表在很多情况下比数组更有优势.特别是在执行插入和删除操作时链表拥有更高的效率.链表需要动态的开辟存储空间,也就是存储空间是在程序运行时分配的.由于在很多应用中数据的大小在编译时并不能确定,因此这种动态分配空间的特性也是链表的一个优点. 单链表介绍 单链表(简称为链表)由各个元素之间通过一个指针彼此链接起来而组成.每个元素包含两个部分:数据成员和一个称为

Java单链表、双端链表、有序链表实现

Java单链表.双端链表.有序链表实现 原创 2014年03月31日 23:45:35 标签: Java / 单链表 / 双端链表 / 有序链表 65040 单链表: insertFirst:在表头插入一个新的链接点,时间复杂度为O(1) deleteFirst:删除表头的链接点,时间复杂度为O(1) 有了这两个方法,就可以用单链表来实现一个栈了,见http://blog.csdn.net/a19881029/article/details/22579759 find:查找包含指定关键字的链接点

数据结构:链表(单链表)

一.链表 概念:链表[Linked List]是由一组不必相连(可连续可不连续)的内存结构(节点),按照特定的顺序链接在一起的抽象数据类型: 分类:链表常用的大概有三类:单链表.双向链表.循环链表(这篇文章主要讲单链表) 操作:链表的核心操作主要有三个(查找遍历.插入.删除) 二.单链表 上图就是一个单链表的数据结构了,从上图可以看出,每个节点包含两个重要的元素(data.next),那么什么是单链表呢? 概念:各个内存结构通过一个Next指针链接在一起,每个内存结构都存在后续的内存结构(链尾除