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]
但这是同样的方法,我在哪里弄错了?
答案 0 :(得分:0)
我访问了该网站,并将您的代码放入其中,以便更轻松地查看最新情况,问题是这一行:
ListNode lastOdd = head.next; // gets the value of last odd even in list.
列表的第一个元素是1,但是你开始的最后一个奇数是列表中的下一个,而不是列表的头部。只需将其更改为:
ListNode lastOdd = head
它提供了正确答案。
代码本身需要一些整理,内部while循环似乎没有任何实际意义,不确定为什么那里或它是先前尝试的剩余元素?
答案 1 :(得分:0)
loop
和travel
个变量在做什么?它们在每次迭代中保持为1,然后为while(loop-- > 0)
循环。抱歉没有得到你想通过该循环实现的目标。
int travel = 1, loop;
while(current != null)
{
loop = travel;
// Prvo petlja putuje do sledeceg neparnog elementa
while(loop-- > 0)
{
解决方案:找到列表中的最后一个节点。通过追加将所有偶定位置的节点移动到最后。确保在第一步中标记为last的节点处停止,否则它将进入无限循环。