在leetcode上有一个叫做奇偶链表的问题。
它说:
给定一个单链表,将所有奇数节点分组在一起,后面跟着偶数节点。请注意,这里我们讨论的是节点数,而不是节点中的值。
你应该试着在适当的地方做这件事。程序应以O(1)空间复杂度和O(节点)时间复杂度运行的例子:鉴于1 -> 2 -> 3 -> 4 -> 5 ->空,返回1 -> 2 -> 3 -> 5 -> 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]
但是方法是一样的,我错在哪里?
我去了这个网站,把你的代码放进去,让它更容易看到发生了什么,问题是这一行:
ListNode lastOdd = head.next; // gets the value of last odd even in list.
列表的第一个元素是1,但是您将最后一个奇数作为列表中的下一个,而不是列表的头。把它改成:
ListNode lastOdd = head
,并给出正确答案。
代码本身需要一些整理,内部while循环似乎没有真正的目的,不知道为什么在那里,或者它是之前尝试的剩余元素?
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)
{
解决方案:查找列表中最后一个节点。通过执行append,将所有偶数位置的节点移动到末尾。请确保在第一步中标记为最后的节点处停止,否则将进入无限循环。