OddEven链接列表代码不适用于leetcode

时间:2016-10-16 17:11:26

标签: java algorithm linked-list

leetcode上有一个名为Odd Even Linked List的问题。

它说:

给定单链表,将所有奇数节点组合在一起,然后是偶数节点。请注意,这里我们讨论的是节点编号,而不是节点中的值。

你应该尝试到位。该程序应该以O(1)空间复杂度和O(节点)时间复杂度运行。

实施例: 给定1-> 2-> 3-> 4-> 5-> NULL, 返回1-> 3-> 5-> 2-> 4-> NULL。

这是我的Node类

public class Node 
{
private int value;
private Node next;

public Node(int Value) 
{
    this.value = Value;
    this.next = null;
}

public Node()
{
    this.value = -1;
    this.next = null;
}

public Node getNext() {
    return next;
}public void setNext(Node next) {
    this.next = next;
}public int getValue() {
    return value;
}public void setValue(int value) {
    this.value = value;
}
}

我在列表中有8个项目,其值为1,2,3,4,5,6,7,8。这是我的输出 - > 1 - > 3 - > 5 - > 7 - > 2 - > 4 - > 6 - > 8 这是解决OddEven任务的链接列表方法。

public void oddEven()
{
    if(head.getNext() == null)
        return;

    Node lastOdd = head.getNext(); // gets the value of last odd even in list.
    Node current = lastOdd.getNext(); // Puts the reference on the first even index.
    Node before = lastOdd; // This node, will always be one index before current Node
    int travel = 1, loop;


    while(current != null)
    {
        loop = travel;
        // Prvo petlja putuje do sledeceg neparnog elementa
        while(loop-- > 0)
        {
            before = current;
            current = current.getNext();
        }

        if(current == null) // If it is end of the list, exit loop.
            break;

        before.setNext(current.getNext());
        current.setNext(lastOdd.getNext());
        lastOdd.setNext(current);
        lastOdd = current;
        current = before.getNext();

    }

}

它在我的电脑上完美运行。但是当我把代码放在leetcode中时,我得到的错误是它不起作用。但它是相同的代码。这是来自leetcode的代码

 /**
* Definition for singly-linked list.
* public class ListNode {
*     int val;
*     ListNode next;
*     ListNode(int x) { val = x; }
* }
*/
  public class Solution {
   public ListNode oddEvenList(ListNode head) 
{

    if(head.next == null)
        return head;

    ListNode lastOdd = head.next; // gets the value of last odd even in list.
    ListNode current = lastOdd.next; // Puts the reference on the first even index
    ListNode before = lastOdd;
    int travel = 1, loop;


    while(current != null)
    {
        loop = travel;
        // Prvo petlja putuje do sledeceg neparnog elementa
        while(loop-- > 0)
        {
            before = current;
            current = current.next;
        }

        if(current == null)
            break;



        before.next = current.next;
        current.next = lastOdd.next;
        lastOdd.next = current;
        lastOdd = current;
        current = before.next;

    }
    return head;
}
}

这是我得到的错误

输入:[1,2,3,4,5,6,7,8]

你的回答:[1,2,4,6,8,3,5,7]

预期答案:[1,3,5,7,2,4,6,8]

但这是同样的方法,我在哪里弄错了?

2 个答案:

答案 0 :(得分:0)

我访问了该网站,并将您的代码放入其中,以便更轻松地查看最新情况,问题是这一行:

ListNode lastOdd = head.next; // gets the value of last odd even in list.

列表的第一个元素是1,但是你开始的最后一个奇数是列表中的下一个,而不是列表的头部。只需将其更改为:

ListNode lastOdd = head

它提供了正确答案。

代码本身需要一些整理,内部while循环似乎没有任何实际意义,不确定为什么那里或它是先前尝试的剩余元素?

答案 1 :(得分:0)

looptravel个变量在做什么?它们在每次迭代中保持为1,然后为while(loop-- > 0)循环。抱歉没有得到你想通过该循环实现的目标。

int travel = 1, loop;
    while(current != null)
    {
        loop = travel;
        // Prvo petlja putuje do sledeceg neparnog elementa
        while(loop-- > 0)
        {

解决方案:找到列表中的最后一个节点。通过追加将所有偶定位置的节点移动到最后。确保在第一步中标记为last的节点处停止,否则它将进入无限循环。