繁体   English   中英

确定循环双向链接列表的头是否是“跳转”周期的一部分

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM