找出一个带环单链表的环开始的结点
一个n方复杂度的算法:
#include <iostream>
using namespace std;
//定义数据结构
struct Node
{
Node(int i):data(i),next(0){}
int data;
Node* next;
};
//释放带环的节点
void node_circle_free(Node* node,Node* point)
{
static bool flag=false;
if(node->next!=point||!flag)
{
if(node->next==point)
flag=true;
node_circle_free(node->next,point);
}
delete node;
return;
}
//打印链表中的数据,存在环,必定是死循环
void node_seq_print(Node* node,Node* point)
{
if(node==NULL)
return;
static bool flag=false;
cout<<node->data<<" ";
if(node->next!=point||!flag)
{
if(node->next==point)
flag=true;
node_seq_print(node->next,point);
}
return;
}
//返回链表环的入口点
Node* returnCircleListPoint(Node* node)
{
int cnt1=0;
int cnt2=0;
Node* p1=node;
Node* p2=node;
while(true)
{
p1=p1->next;
cnt1++;
while(p2!=p1)p2=p2->next,cnt2++;
if(cnt2<cnt1)
return p1;
p2=node;
cnt2=0;
}
}
int main()
{
Node *node=new Node(0);
Node* head=node;
Node* temp=0;
for(int i=1;i<7;++i)
{
node->next=new Node(i);
node=node->next;
if(i==4) //设定环的入口
temp=node;
if(i==6) //这个设定为尾节点
{
assert(temp!=0);
node->next=temp;
}
}
Node* circlePoint=returnCircleListPoint(head);
cout<<circlePoint->data<<endl;
node_seq_print(head,circlePoint);
node_circle_free(head,circlePoint);
return 0;
}
分享到:
相关推荐
求单链表是否有环,如果有环求出环的入口点及环长
本文档详细证实带环单链表快慢指针证明方法,其实难以理解的地方就是证明这个指针是如何追到它的
约瑟夫环c单链表问题描述:约瑟夫问题的一种描述是:编号为1,2,…,n的n个人按顺时针方向围坐一圈,每人持一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数...
单链表解决约瑟夫环问题
利用单向循环表存储结构模拟约瑟夫环过程,按照出列顺序打印个人编号
如何找带环单链表的环的入口 这里只说比较可行的算法吧。 思路一:HashSet第一个重复元素就是环的入口 按照查找单链表带环的思路二,我们用一个HashSet维护已经跑过的元素,当重复的时候,那个结点就是环的入口。这...
这个使用单链表实现的,里面还有寻找单链表环的入口的问题
C CODE FOR :只遍历一遍找出单链表的倒数第K个节点
实现约瑟夫环的小程序 建立单循环链表 查找报数为del的小孩结点 删除报数为del的小孩结点 释放报数为del的小孩结点空间
建立一个由正整数组成的无序单链表,编写算法实现下列功能:找出最小值结点,且显示该数值;若该数值为奇数,则将其与直接后继结点的数值交换。若为偶数,则将其直接后继结点删除。
笔试时,常见的题型。判断单链表中是否存在环
实验二 单链表实验 一、实验目的 1、掌握用Visual C++6.0上机调试单链表的基本方法 2、掌握单链表的插入、删除、查找、求表长以及有序单链表的合并算法的实现 二、实现内容 1、单链表基本操作的实现 在带头结点的...
带表头结点的单链表,通过了运行,没有错误
带结点的单链表的创立 输出 倒置 删除 带结点的单链表的创立 输出 倒置 删除
构造两个带有表头结点的有序单链表La、Lb,编写程序实现将La、Lb合并成一个有序单链表Lc。 合并思想是:程序需要3个指针:pa、pb、pc,其中pa,pb分别指向La表与Lb表中当前待比较插入的结点,pc 指向Lc表中当前最后...
用单链表解决约瑟夫环问题,数据结构实验报告。约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人...
首先给出环形单链表的数据结构: class Node(object): def __init__(self, value, next=0): self.value = value self.next = next # 指针 class RingLinkedList(object): # 链表的数据结构 def __init__(se
C++ 单链表反转 C++ 单链表反转 C++ 单链表反转
创建链表,插入元素,删除元素,找元素位置,知道位置求值等,绝对好用
使用C++实现单链表的基本操作: 1、创建单链表 2、遍历单链表 3、单链表插入 4、删除单链表 5、判断是否为空 6、单链表的长度 7、单链表查找 8、退出