我正在尝试解决一个简单的leetcode问题:
反转单链接列表。链接
这是我的代码:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution {
public ListNode reverseList(ListNode head) {
if (head == null)
{
return head;
}
ListNode prev = null;
while (head != null && head.next != null)
{
ListNode current = head;
current.next = prev;
prev = head; // I think the problem is with this statement
head = head.next;
}
return head;
}
}
我试图做的是遍历列表的所有节点,并在每一步通过将前一个节点保存在ListNode变量中来将当前节点链接到前一个节点。
这是测试用例和输出,可以让您更轻松。
输入:[1,2]输出:[]预期:[2,1]
同样,我并不是真的在寻找替代解决方案或递归解决方案。我只想知道我的代码有什么问题(以及逻辑(如果适用))。
您的代码实际上只进行一次迭代,因为它的工作原理如下:
ListNode current = head;
// You assign head.next to prev here
// which is equal to null for the first iteration
current.next = prev;
prev = head;
// And here you go to head.next, which was set to null above
head = head.next;
// The head is null, so the while loop ends
由于您没有要求正确的解决方案,我将给出如何修复它的提示:您应该将head.next
存储在某个地方,然后再将其分配给prev
。
您忘记在覆盖之前保存head.next。
当您将head分配给ListNode当前时,您只分配了一个引用,而不是复制节点。所以当前
完全是head
的同义词(并且是多余的)。