C++算法之 查找链表中间节点

解析:设立两个指针,p每次移动两下,q每次只移动一下,那么当p指向最后一个节点的时候,那么q就是中间的节点了

ListNode* FindMidNode(ListNode* pHead)
{
	if (pHead == NULL)
	{
		return NULL;
	}
	if (pHead->m_pNext == NULL || pHead->m_pNext->m_pNext == NULL)
	{
		return pHead;
	}
	ListNode* pFirstNode  = pHead;
	ListNode* pSecondNode = pHead;

	while(pFirstNode->m_pNext!= NULL && pFirstNode->m_pNext->m_pNext != NULL)//如果链表结点数为偶数,输出中间两个结点前面的一个。
	{
		pFirstNode  = pFirstNode->m_pNext->m_pNext;
		pSecondNode = pSecondNode->m_pNext;
	}

	return pSecondNode;
}
// FindMidNodeList.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
using namespace std;

struct ListNode
{
	int  m_nValue;
	ListNode* m_pNext;
	ListNode(int k): m_nValue(k),m_pNext(NULL)
	{

	}
};

ListNode* FindMidNode(ListNode* pHead)
{
	if (pHead == NULL)
	{
		return NULL;
	}
	if (pHead->m_pNext == NULL || pHead->m_pNext->m_pNext == NULL)
	{
		return pHead;
	}
	ListNode* pFirstNode  = pHead;
	ListNode* pSecondNode = pHead;

	while(pFirstNode->m_pNext!= NULL && pFirstNode->m_pNext->m_pNext != NULL)//如果链表结点数为偶数,输出中间两个结点前面的一个。
	{
		pFirstNode  = pFirstNode->m_pNext->m_pNext;
		pSecondNode = pSecondNode->m_pNext;
	}

	return pSecondNode;
}

int _tmain(int argc, _TCHAR* argv[])
{

	ListNode* head  = new ListNode(1);
	ListNode* Node1 = new ListNode(2);
	ListNode* Node2 = new ListNode(3);
	ListNode* Node3 = new ListNode(4);
	ListNode* Node4 = new ListNode(5);
	ListNode* Node5 = new ListNode(6);
	ListNode* Node6 = new ListNode(7);

	head->m_pNext = Node1;
	Node1->m_pNext = Node2;
	Node2->m_pNext = Node3;
	Node3->m_pNext = Node4;
	Node4->m_pNext = Node5;
	Node5->m_pNext = NULL;
	//Node6->m_pNext = NULL;

	ListNode* p = FindMidNode(head);
	cout<<p->m_nValue<<endl;

	getchar();
	return 0;
}
时间: 2024-11-10 20:43:33

C++算法之 查找链表中间节点的相关文章

链表(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 *SearchMidNo

查找链表中间节点

我们可以弄两个指针都指向头节点,然后一个指针每次走一步,另一个每次走两步. #include<stdio.h>typedef struct link{ int a; struct link *next;}link_t;void main(){ link_t A = {1,NULL}; link_t B = {2,NULL}; link_t C = {3,NULL}; link_t D = {4,NULL}; link_t E = {5,NULL}; A.next = &B; B.nex

链表中间节点位置

查找链表中间节点位置有多种方式,首先会想到先遍历一遍获知节点个数,然后取一半作计数器控制访问步数. 另一种常会用到的是设置两个指针:fast_p, slow_p,步长分别为2和1,这样根据物理中 路程公式 s = v * t; fast_p走过的路程是slow_p的两倍,fast_p走到链表尾部时,slow_p一定在中间或中间左边第一个节点. 切记,循环终止条件是(fast == null || fast.next == null) 不需要判断slow的状态. 如上图,序号分表代表第几次循环,同

链表(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个节点,然后快慢指针再同时遍历链表,当快指

[LeetCode]93. Linked List Cycle II查找链表中环的起始节点

Given a linked list, return the node where the cycle begins. If there is no cycle, return null. Note: Do not modify the linked list. Follow up:Can you solve it without using extra space? Subscribe to see which companies asked this question 解法:这道题是题目L

数据结构与算法JavaScript (三) 链表

数据结构与算法JavaScript (三) 链表 我们可以看到在javascript概念中的队列与栈都是一种特殊的线性表的结构,也是一种比较简单的基于数组的顺序存储结构.由于 javascript的解释器针对数组都做了直接的优化,不会存在在很多编程语言中数组固定长度的问题(当数组填满后再添加就比较困难了,包括添加删除, 都是需要把数组中所有的元素全部都变换位置的,javascript的的数组确实直接给优化好了,如 push,pop,shift,unshift,split方法等等…) 线性表的顺序

算法实例_链表结构 By:比方

前一章,我们说到了顺序表结构,而顺序表也存在一些的缺点. 在插入或者删除节点的时候,需要移动的数据比较大,如果顺序表结构比较大,有时候比较难以分配足够的连续存储空间,可能会导致内存分配失败,而导致无法存储. 而今天我们讲解的链表结构则可以很好的解决这个问题,链表的结构是一种动态存储分配的结构形式,可以根据需要动态申请所需的内存单元. 一.什么是链表结构? a)         我们用head来表示头节点. b)         数据部分保存的是存储的数据,地址地方指向下一个数据的起始部分,依次向

数据结构与算法(c++)——查找二叉树与中序遍历

查找树ADT--查找二叉树 定义:对于树中的每个节点X,它的左子树中的所有项的值小于X中的项,而它的右子树中所有项的值大于X中的项. 现在给出字段和方法定义(BinarySearchTree.h) #include <queue> class BinarySearchTree { private: struct Node { int value; Node* left; Node* right; }; Node* root; void insert(Node*, int); void trav

排序算法----快速排序(链表形式)

单链表形式实现排序算法. 这个快速排序主要利用递归调用.包含4个文件,头文件QuickSort.h,fatal.h,库函数QuickSort.c,测试文件TestQuickSort. QuickSort.h 1 typedef long ElementType; 2 #ifndef _List_H//如果没有编译过 3 #include<stdbool.h> 4 struct Node; 5 typedef struct Node *PtrToNode; 6 typedef PtrToNode