反向链接列表Java内存

时间:2017-05-19 19:37:38

标签: java algorithm linked-list

我正在做这个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) {       
        ListNode curr = null;
        ListNode lst = null;
        while (head != null)
        {
            curr = head;
            curr.next = lst;
            lst = curr;
            head = head.next;
        }

        return curr;

    }
}

4 个答案:

答案 0 :(得分:1)

其他答案在解释问题方面做得很好。为了解决这个问题,我想你在循环中需要的就是:

lst = curr;
curr = head;
head = head.next;
curr.next = lst;

这将遍历列表并反转指针。

这就是你要找的东西吗?

所以完整的代码:

public class Solution {
    public ListNode reverseList(ListNode head) {       
        ListNode curr = null;
        ListNode lst = null;
        while (head != null)
        {
            lst = curr;
            curr = head;
            head = head.next;
            curr.next = lst;
        }
        return curr;
    }
}

答案 1 :(得分:0)

我认为这是因为当您设置curr = head;时,您将curr设置为对head的引用。因此,当您设置head = head.next时,它将head设置为null并结束循环。

答案 2 :(得分:0)

curr = head;

以上行存储head变量中curr对象的引用。

curr.next = lst;

现在这会使head.next = null,因为lst最初是nullcurr持有head对象的引用。

lst = curr;

您正在变量lst以引用实际为curr的{​​{1}}。

head

现在如前所述,head = head.next; head.next,因此循环终止。 null指向curr。您已修改原始列表,该列表仅包含原始列表的头部。

答案 3 :(得分:0)

在java中了解一下java中的引用和对象。 Java总是传递引用的副本。所以,当你这样做时,

 curr = head;

curr和head指向同一个对象。当你这样做时,

 curr.next = lst;

curr.next和head.next都开始指向null(在null中为lst)。 然后你下次循环休息。

试试这个解决方案它会起作用。

public class Solution {
    public ListNode reverseList(ListNode head) {       
        ListNode nxt = null;
        ListNode lst = null;
        while (head != null)
        {
            nxt = head.next;
            head.next = lst;
            lst = head;
            head = nxt;
        }
        return lst;
    }
}