打印链表的第二个三分之一

时间:2013-04-13 13:18:56

标签: list linked-list complexity-theory pseudocode

有n个节点的列表。

我必须编写一个伪代码,使用3个指针打印列表第二个三分之一的节点。什么是复杂性?

如果我可以通过计数器使用,那很简单,但这是禁止的。

我考虑将前三个节点的三个指针放在一起,然后在第三个指针旁边。如果它不是终端节点,请在第二个节点旁边..但我的伪代码太长而且复杂。

另一个问题:如何使用两个指针来完成?

例如:列表:1-> 2-> 3-> 4-> 5-> 6-> 7-> 8-> 9可以打印元素:4,5 6。

任何帮助表示赞赏!

4 个答案:

答案 0 :(得分:1)

  • 将所有指针设置为列表的头部。
  • 虽然指针3不为空且其下一个不为空,但是将指针1推进1个节点,将指针2推进2个节点,将指针3推进3个节点(如果你到达终点,则停止)。
  • 一旦pointer3到达列表的末尾,每个指针将是列表中的1/3,您只需打印它们之间的所有节点。

两个指针只是一个变种,但你写这个问题的方式有点模糊

  

列表的第二个三分之一的节点(2/3)

对我来说,“第二个三分之一”意味着列表的中间三分之一,但你写了2/3。

答案 1 :(得分:1)

使用2个指针很容易: 将指针1放在第一个位置 指针2在第3位

并且做:

while pointer2 not null{
print pointer1
pointer1.next
print pointer1
pointer1.next
pointer2.next 3 times if pointer2 is not null
}

例如,列表是1,2,3,4,5,6

pointer1=1
pointer2=3

pointer2/=null then
print pointer1 (1)
pointer1.next
print pointer1 (2)
pointer1.next
pointer2=pointer2.next 3 times then pointer2=6

再次

pointer2/null then
print pointer1 (3)
pointer1.next
print pointer1 (4)
pointer1.next
pointer2.next is null, then the program will terminate here

你得到的清单是1,2,3,4,它是6个元素列表中的2/3

这里有任何疑问的答案:)

答案 2 :(得分:1)

最后是双指针解决方案,没有计数器,没有双链表

set the pointer1 in the 1st position
set the pointer2 in the 3rd position

while pointer2/=null{
pointer1.next
pointer2.next 3 times if pointer2=/null
}

//at this point we have the pointer1 in the first middle third element
//we only have to do the process again, but printing the elements
//we have to set the pointer2 to the third element, to start again

set the pointer2 in the 3rd position

while pointer2/=null{
pointer1.print
pointer1.next
pointer2.next 3 times if pointer2/=null
}

在第一次迭代中,我们将pointer1放在中间三分之一的第一个元素中,在第二次迭代中我们打印了我们需要的所有元素,诀窍是当指针2第一次到达末尾时重置它

答案 3 :(得分:0)

我找到了带有两个指针的其他解决方案但链接列表必须是双链表(带有next和prev)

set pointer 1 to the first element
set pointer 2 to the third element
while pointer 2/=null {
pointer1.next
pointer2.next 3 times if pointer2.next/=null
}
//in this part we have pointer1 in the first middle third element
while pointer1/=pointer2{
pointer1.next
pointer1.print
pointer2.prev
}

再次以1,2,3,4,5,6为例

pointer1=1
pointer2=3

pointer2.next/=null then
pointer1.next (pointer1=2)
pointer2.next 3 times, (pointer2=6)

pointer2.next=null then we enter in the second loop
pointer1.next  (pointer1=3)
pointer1.print (3)
pointer2.prev (pointer2=5)

pointer1/=pointer2 then
pointer1.next (pointer1=4)
pointer1.print(4)
pointer2.prev (pointer2=4)

pointer1==pointer2, end of program

我们在控制台输出中有3,4个