博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
判断单链表是否有环
阅读量:4953 次
发布时间:2019-06-12

本文共 1604 字,大约阅读时间需要 5 分钟。


单链表环路问题


  •  如何计算单链表是否存在环路

          设计两个指针变量p和q,都指向链表表头,遍历该链表,且p=2p,当遍历到p=q时,说明该链表存在环路,如果p为null,则说明该链表不存在环路。

boolean isLoop(Link head){        Link p = head;    Link q = head;    while(p != null){        p = p.next;        if(p == null)            break;        p = p.next;        q = q.next;        if(p == q){            System.out.println("there is a loop in the link");            break;        }    }    if(p == null){        System.out.println("there is no loop in the link");        return false;    }    return true;}
  • 如果有环,如何计算环的起始节点

         结论:分别从p和q相遇的结点和头结点依次向后遍历,当遍历指针再次相遇时,相遇节点即为起始节点。

         推导过程:如下图所示红色结点为相遇结点,头结点到起始节点的距离为m,起始节点到相遇结点的距离为n,环为r,链表的长度为L。

         当经过m+n步之后p和q相遇,即m+n=kr=(k-1)r+r=(k-1)r+L-m,即可得:m=(k-1)r+L-m-n。从而得出头结点到环起始节点的距离等于相遇结点到起始节点的距离。

Link firstNode(Link head){	Link fast = head;	Link slow = head;	while(fast != null && fast.next != null){		fast = fast.next.next;		slow = slow.next;		if(fast == slow)			break;	}	if(fast == null)		return null;   //there is no loop in the linkList	fast = head;	while(fast != slow){		fast = fast.next;		slow = slow.next;	}	return fast;}
  • 如果有环,计算环的长度

          按照如上所得的起始节点,一次遍历直到再次遍历到起始节点,则可得环的长度;如只计算环的长度,则从slow和fast相遇结点开始计数,直到再次到达相遇结点,slow所走过的长度即为环的长度。

int loopLength(Link head){	Link slow = head;	Link fast = head;	int length = 0;	boolean Flag = false;    //是否相遇过一次	while(fast != null && fast.next != null){		fast = fast.next.next;		slow = slow.next;		if(Flag)			length++;		if(fast == slow){			if(Flag == false)				Flag = true;			else{				break;			}		}	}	return length;}
  • 判断两个不含环的单链表是否相交,如果相交求其交点

          将其中的一个链表首尾相连,然后判断另一个链表是否带环即可,如下图所示:

 

转载于:https://www.cnblogs.com/zhanglei93/p/5815305.html

你可能感兴趣的文章
UI Recorder安装与使用
查看>>
自动化案例
查看>>
Container With Most Water
查看>>
本博客食用指南
查看>>
A·F·O小记
查看>>
[CTS2019]珍珠——二项式反演
查看>>
triplet
查看>>
NOI2019 游记——一切都是最好的安排
查看>>
LibreOJ NOI Round #2 Day 1
查看>>
[NOI2016]国王饮水记
查看>>
233
查看>>
再探容斥好题——ROOK
查看>>
CF908G New Year and Original Order
查看>>
本地在不安装Oracle的情况下安装PLSQL客户端
查看>>
Python argparse 处理命令行小结
查看>>
分布式系统心跳协议的设计
查看>>
malloc vs memset
查看>>
c++ rvo vs std::move
查看>>
linux du
查看>>
how to compile and replace ubuntu kernel
查看>>