[英]Determing if the head of a circular doubly-linked list is part of a “jump” cycle
有一个双向链表这也是盘旋(即最后一个节点的next
指针指向列表的头部和头部的prev
指针指向最后一个节点)。
每个节点中的data
都是整数。
对于节点p
循环列表中的跳转定义如下:
p.data
为正,我们使用next
指针移动p.data
次 p.data
为负,我们使用prev
指针移动p.data
次 p.data
为0,则完全不移动。 我需要编写一个方法,该方法接收指向列表开头的指针作为参数,如果存在在开头节点处开始和结束的跳转路径,则返回true
。
示例列表:
node | data | next | prev ------|------|------|------ 0 | 2 | 1 | 5 1 | 14 | 2 | 0 2 | -5 | 3 | 1 3 | 1 | 4 | 2 4 | -4 | 5 | 3 5 | 1 | 0 | 4
对于此列表,该方法应返回true
。 从头(节点0)开始,我们向前移动两次至节点2,然后向后移动5次至节点3,向前移动一次至节点4,最后向后移动4次,返回节点0:
node | jumps | next node -------|-------|----------- 0 | 2 | 2 2 | -5 | 3 3 | 1 | 4 4 | -4 | 0
我的主要问题是何时应该返回false
。
这不是家庭作业(我正在做不同的练习,以便为考试做准备)
有很多方法可以做到这一点。
例如,如果您在n次跳跃之后没有回到头部(n是列表的长度),则可以返回false,因为这意味着您正在循环访问列表的另一部分。
您还可以标记访问过的节点,如果两次访问任何节点(头部除外),则返回false。
如果到达的不是列表的开头0,则还必须直接返回false。
首先确定该方法何时停止,即再次出现上述问题时停止条件是什么,该方法将再次开始移动并返回2,此过程将继续进行。 上面指定的唯一停止条件是零中出现零,否则该程序将永不停止。
如果到达头节点也可能导致程序停止,则可以通过以下方式完成代码:
findHead(head,originalHead,calledCount){
if(originalHead==null)
{
return false;
}
else if (head==originalHead && calledCount>1)
/*If while roaming gets to the head then returns true but except the first time where the head will always be equal to original head */
{
return true;
}
else {
p=head;
if(p.data>0)
{
steps=p.data;
while(steps>0)
{
p=p->next;
steps--;
}
findHead(p,originalHead,calledCount);
}
else if(p.data<0)
{
steps=p.data;
while(steps<0)
{
p=p->prev;
steps++;
}
findHead(p,originalHead,calledCount);
}
else // If obtained 0 in the list
{
if (p==originalHead)
{
return true;
}
else
{
return false;
}
}
}
calledCount++;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.