`
moxiaomomo
  • 浏览: 45707 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

查找链表的中间节点

阅读更多

使用两个指针,一个指针每次前移一步,一个指针前移两步。
那么当第二个指针走到链表尾端时,第一个指针就是链表中的相对中间节点位置。

代码实现:
template<class T>
T findMidElem(Node<T> *head)
{
	Node<T> *ptr1,*ptr2;
	ptr1=head;   //每次移动一步的指针
	if(ptr1==NULL)return NULL;
	ptr2=head->next; //每次移动两步的指针

	if(ptr2==NULL)return head->data;

	while(ptr2->next!=NULL) //检查ptr2当前是否指向链表末节点
	{
		ptr1=ptr1->next;
		ptr2=ptr2->next->next;
		if(ptr2==NULL)break; //如果指针为NULL则可以退出
	}

	return ptr1->data;
}
1
5
分享到:
评论

相关推荐

    数据结构 链表 查找倒数第N个节点的值 查找中间节点的值

    ### 数据结构:链表——查找倒数第N个节点与中间节点 #### 一、基础知识回顾 在深入了解本文档中的代码之前,我们首先简要回顾一下链表的基础知识。 **链表**是一种线性表的数据结构,其特点是通过指针连接各个...

    c语言编程题之链表操作链表的中间节点.zip

    在C语言编程中,链表是一种非常重要的数据结构,它不同于数组,不需要预先分配连续的内存空间,而是通过节点间的...本压缩包提供的编程题目就是一个很好的实践机会,通过实际编写代码来加深对链表中间节点查找的理解。

    一次遍历查找单向链表的中间结点

    // 查找链表中间结点 Node* findMiddleNode(Node* head) { Node* slow = head; Node* fast = head; if (head != NULL) { fast = fast-&gt;next; } while (fast != NULL && fast-&gt;next != NULL) { slow = slow-...

    常见的链表面试题大汇总

    常见的链表面试题大汇总: 1,创建一个链表结点 2,遍历链表中的所有结点 3,倒序打印链表 4,往链表末尾添加结点 ...10,查找链表中间节点 11,判断链表是否有环 12,判断链表是否有环,并返回环上的节点数目

    数据结构与算法 全 数据结构与算法全 Java

    7) **查找链表中间节点**:找到链表的中间节点。 8) **回文链表**:判断链表是否为回文。 9) **环形链表**:检测链表是否有环。 10) **环形链表 II**:找到环的入口节点。 11) **删除节点**:在不知道节点值的情况下...

    c++对链表建立,查找,删除处理

    删除链表节点需要稍微复杂一些,因为我们需要处理头节点和中间节点的删除。以下代码演示了如何删除特定位置的节点: ```cpp void deleteNodeAtPosition(ListNode*& head, int position) { if (head == nullptr || ...

    链表-头插法,尾插法,中间插入.zip

    中间插入法的时间复杂度取决于查找目标位置前一个节点的时间,最坏情况下为O(n)。 在C++和C#中实现链表操作,需要定义节点结构体或类,包括存储数据的成员和指向下一个节点的指针。C++中可以使用结构体,如`struct ...

    通用链表源代码

    4. 查找节点:根据给定的条件查找链表中的节点。 5. 遍历链表:按照顺序访问链表的所有节点。 6. 获取链表长度:计算链表中节点的数量。 7. 清空链表:释放链表中所有节点的内存并删除链表。 在 `linklist.c` 文件...

    #真题#阿里巴巴客户端笔试题

    - **数组与链表**:比如反转链表、查找链表中间节点等。 - **树**:二叉树的遍历(前序、中序、后序)、平衡二叉树的判断等。 - **图**:最短路径算法(如Dijkstra算法)、深度优先搜索/广度优先搜索等。 - **排序...

    c#链表的合并和反转取中间值操作

    **取链表中间值**: 找到链表的中间元素可以使用快慢指针的方法。一个慢指针每次移动一个节点,而快指针每次移动两个节点。当快指针到达链表末尾时,慢指针就位于链表的中间位置。 ```csharp LinkedListNode&lt;int&gt; ...

    C语言实现单向链表的创建、插入,删除节点,和2个链表合并

    插入节点操作分为在链表开头插入(头部插入)和在链表中间或末尾插入。在链表开头插入新节点,只需更新头节点即可;在中间或末尾插入,需要找到插入位置并更新前后节点的指针。 ```c Node* insertAtBegin(Node* ...

    Programming Interviews Exposed 程序员面试攻略 2007 第2版

    - **链表操作**:反转链表、合并两个排序链表、查找链表中间节点等常见操作。 - **面试题示例**:例如,如何判断一个链表是否有环。 #### 5. 树和图 (Trees and Graphs) - **树的基本概念**:二叉树、平衡二叉树、...

    leetcode-链表笔记

    - **快慢指针**:在查找环和确定链表中间节点时,使用快慢指针可以有效解决问题。 - **双指针**:在合并链表或查找特定节点时,两个指针可以同步进行不同操作。 5. **链表的应用场景** - 在数据库中,B树和B+树...

    链表的19种算法(C语言)

    15. **链表中位数**:找出链表的中间节点,可以采用快慢指针,也可以先排序再取中间。 16. **按顺序交替合并两个链表**:将两个链表的节点交替插入新的链表中,如1-&gt;2-&gt;1-&gt;2-&gt;...。 17. **删除倒数第k个节点**:...

    链表的创建和输出链表的创建和输出

    链表是一种基础且重要的数据结构,它在计算机科学中扮演着不可或缺的角色。...同时,也可以尝试解决一些与链表相关的编程问题,如查找链表的中间节点、反转链表、合并两个有序链表等,来提升链表操作的技巧。

    链表基本操作源码

    删除中间节点同样需要找到前一个节点。 6. **双向链表** 双向链表相比单向链表,增加了对前一个节点的引用,这使得在链表中的前后移动更加灵活。例如,删除节点后,可以通过prev指针找到前一个节点,而无需从头...

    数据结构实验程序(包括链表 查找)

    在单链表中进行顺序查找意味着从头节点开始,逐一检查每个节点的数据域,直到找到目标元素或遍历完整个链表。这一过程虽然简单易懂,但在链表较长时,其查找效率较低,因此在实际应用中往往需要更高效的查找算法。...

    链表插入结点算法

    链表的主要操作包括:插入节点、删除节点、查找节点等。其中,插入节点是链表中最常见的操作之一。 #### 2. 插入节点的基本原理 插入节点的基本思想是在链表中的指定位置添加一个新的节点。根据不同的需求,可以将...

    易语言链表操作类源码

    5. **查找节点**:在链表中搜索特定的节点,返回其在链表中的位置或者节点本身。 6. **链表长度**:计算链表中的节点数量。 7. **合并链表**:将两个链表合并为一个,通常在排序算法中会用到此功能。 8. **反转链表*...

    数据结构链表课程设计

    - 删除链表中间节点。 - 删除链表尾部节点。 #### 3. 查找操作 查找操作是指根据给定值在链表中查找对应的节点。 #### 4. 排序操作 链表的排序可以采用多种算法实现,如冒泡排序、选择排序等。 #### 5. 遍历操作 ...

Global site tag (gtag.js) - Google Analytics