链表(6)----查找链表中间节点

1、链表定义

typedef struct ListElement_t_ {
    void *data;
    struct ListElement_t_ *next;
} ListElement_t;

typedef struct List_t_{
    int size;
    int capacity;
    ListElement_t *head;
    ListElement_t *tail;
} List_t;

2、查找链表中间节点,设置快慢指针,快指针一次走两步,慢指针一次走一步

void *SearchMidNode( List_t *list){
    if ( list == NULL || list->head == NULL )
        return NULL;

    ListElement_t *pFast = list->head;
    ListElement_t *pSlow = list->head;

//若节点为N个, N为奇数,则返回第N/2 +1个节点, N为偶数,则返回第N/2个节点
    while( pFast->next  != NULL && pFast->next->next != NULL){
        pFast = pFast->next->next;
        pSlow = pSlow->next;
    }

    return pSlow->data;
}
时间: 2024-10-18 15:29:03

链表(6)----查找链表中间节点的相关文章

链表(5)----查找链表倒数第K个节点

1.链表定义 typedef struct ListElement_t_ { void *data; struct ListElement_t_ *next; } ListElement_t; typedef struct List_t_{ int size; int capacity; ListElement_t *head; ListElement_t *tail; } List_t; 2.查找链表第K个节点数据 设置快慢指针,快指针超前慢指针k-1个节点,然后快慢指针再同时遍历链表,当快指

单链表的经典操作,查找链表倒数第k个节点,判断链表是否存在环,求环节点

#include<stdio.h>#include<stdlib.h> typedef struct date_list{    int data;    struct date_list* next;}mylist; mylist* creatlist(int x,mylist* p)        //用一个元素创建链表{    if(NULL == p)                         //链表创建必须判空    {        p = malloc(siz

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

// 查找链表的倒数第K个结点 PSListNode FindLastKNode(PSListNode pHead, int K ) { PSListNode pFast = pHead ; PSListNode pSlow = pHead ; if (pHead == NULL || K <= 0) { return NULL ; } while (--K ) { if (pFast == NULL ) { return NULL ; } pFast = pFast->pNext; } wh

单向链表的查删改功能,以及约瑟夫环,相交链表的第一个相交节点的查找等相关问题

slist.h//头文件 #ifndef _SLIST_H_ #define _SLTST_H_ #include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> typedef int SLTDataType; typedef struct SListNode { SLTDataType data; struct SListNode* next; }SListNode; voi

【剑指offer】链表倒数第k个节点

转载请注明出处:http://blog.csdn.net/ns_code/article/details/25662121 在Cracking the Code Interview上做过了一次,这次在九度OJ上测试,AC. 题目描述: 输入一个链表,输出该链表中倒数第k个结点.(hint: 请务必使用链表.) 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行为两个整数n和k(0<=n<=1000, 0<=k<=1000):n代表将要输入的链表元素的

单链表反向查找

题目:已知一个带有附加头节点的单链表,节点结构为(data,link).假设该链表只给出了头指针first.在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第i个位置上的节点,若查找成功,算法返回该节点的地址:否则返回NULL. 分析:用一个指针p指向链表的首节点,另一个指针q找到链表正数第i个节点,然后平移指针p和指针q,当指针q指向链表最后一个节点时,指针p恰好指向链表倒数第i个节点.算法思路如下图(查找倒数第二个节点) 源码: template<class T> Link

单向非循环链表:链表创建、节点插入、链表打印、节点长度计算、链表清空、链表销毁

/* 单向非循环链表:    初始化    前插入 后插入    打印    链表长度    清空    销毁*/#include <stdio.h>#include <stdlib.h> #define itemType int typedef struct node{    itemType data;    struct node *pNext;}Node; /* 创建Head节点: 节点的pNext为NULL */int initList(Node **ppN){    N

数据结构:单向链表系列5--在链表中查找元素

在链表中查找元素 函数签名: bool search(Node *head, int x) 如果在链表中查找到这个元素返回true,否则false 迭代法 2) 初始化一个节点指针, current = head. 3) 如果current不为NULL执行以下循环 a) current->key 等于当前待查找值key则返回true. b) current = current->next 4) 否则返回 false /*Checks whether the value key is prese

两个链表的第一个公共节点

已知有两个链表,他们可能相交于某一点,求出该点. 方法1.对于第一个链表,每访问一个节点,对该节点做标记.访问第二个链表,如果该元素已经访问,则第一个这样的元素就是所求点. 由于两个链表都访问了一遍,因此时间复杂度O(m+n),空间复杂度O(m)或O(n) 方法2.我们定义节点的距离为节点到链表开始所经过的节点数.如果两个链表长度相同,则相交节点其在两个链表上的距离一定相等.对于长度不同的两个链表,我们可以采用对齐的方式,使其向长度短的链表对齐.这样就可以应用上面的思路.具体算法如下: [cpp