数据结构之快慢指针查找链表中间结点
来源:互联网 发布:塞班3软件下载 编辑:程序博客网 时间:2024/05/18 11:23
单链表是一种十分常见和应用广泛的数据结构,也是面试题经常会问到的一个。近期复习单链表,就将这个单链表常见的考点顺便复习了一遍。
面试题:如何最快的获取单链表的中间节点的位置?
一般思路,从头节点开始一个一个元素去遍历,而后确定链表的长度。然后又从头开始遍历单链表,并且进行计数。当计数到达单链表长度一半的位置即为单链表的中间节点。
高级思路,设置两个指针,步长分别为1和2.即为慢和快指针。当快指针指向链表的末尾时,慢结点刚好位于链表的中间位置。直接进行返回即可获得链表的中间节点。
相关示例代码如下:
//// main.cpp// 快速查找链表的中间节点////#include <iostream>using namespace std;// 算法思想,采用快慢两个指针,同时从指针的头节点开始遍历。快指针每次一动2个结点,慢指针每次移动一个结点。经过L/2次移动之后就可以完成中间节点的寻找。struct Node{ int data; Node* pNext;// 节点指针};typedef Node* LinkList;// 头插法创建单链表LinkList LinkedListCreatH(){ Node *L; L = (Node *)malloc(sizeof(Node)); //申请头结点空间 L->pNext = NULL; //初始化一个空链表 int x; //x为链表数据域中的数据 cout<<"请输入数据"<<endl; while(scanf("%d",&x) != EOF) { Node *p; p = (Node *)malloc(sizeof(Node)); //申请新的结点 p->data = x; //结点数据域赋值 p->pNext = L->pNext; //将结点插入到表头L-->|2|-->|1|-->NULL L->pNext = p; } return L;}// 插入节点void Insert(LinkList L,Node* node,int index){ int i = 0; Node* ptemp = L; while (i < index&&ptemp->pNext != NULL) {// 找到节点 ptemp = ptemp->pNext; i++; } node->pNext = ptemp->pNext; ptemp->pNext = node;}// 遍历单链表void printList(LinkList L){ while (L != NULL) { cout<<L->data<<endl; L = L->pNext; }}// 寻找单链表的中间节点void findMinNode(LinkList L){ Node* pNode = L; while (L != NULL&&pNode->pNext !=NULL) { L = L->pNext; pNode = pNode->pNext; pNode = pNode->pNext; } cout<<"中间节点为:"<<L->data<<endl;}int main(int argc, const char * argv[]) { // insert code here... std::cout << "Hello, World!\n"; LinkList m_list = LinkedListCreatH(); Node tempData; tempData.data = 9; Insert(m_list, &tempData, 4); printList(m_list); findMinNode(m_list); return 0;}
最后获得单链表的中间节点为4.当然,快慢指针还可以用于判断一个单链表是否存在环以及两个单链表是否相交等场景。
0 0
- 数据结构之快慢指针查找链表中间结点
- 数据结构——快慢指针法查找链表中间值
- 链表面试题之快慢指针问题(一) 查找链表中间节点
- 线性表(插入/清除数据/快慢指针查找中间数据)
- 【数据结构】单链表—求链表中间节点(只遍历一次链表)— 快慢指针
- c语言快慢指针之找未知长度单链表中间结点 的值并显示
- 链表的快慢指针:查找中点
- 链表的快慢指针:查找中点
- 链表使用快慢指针求中间值
- 数据结构(四)之单链表查找中间结点
- 数据结构(四)之单链表查找中间结点
- 关于尾插法的优化和快慢指针查找中间节点
- 链表追赶之快慢指针
- 链表之快慢指针续
- 链表操作之快慢指针
- 快慢链表和快慢指针
- 【面试题】-求未知长度的链表的中间节点(快慢指针)
- 单链表操作之查找中间结点
- 有关指针初始化的误区
- 【Leetcode】:104. Maximum Depth of Binary Tree 问题 in JAVA
- jfreechart 问题
- Tempter of the Bone
- Logistic Function
- 数据结构之快慢指针查找链表中间结点
- java字符串中如何显示双引号
- 深入源码解析Android中的Handler,Message,MessageQueue,Looper
- POJ 2431 Expedition
- 成功整合dede与ucenter详细步骤
- 南京理工校赛同步 I题 puzzle 2-sat+二分
- nsjson to nsdictionary
- js函数4-闭包
- Android面试题(四)