【发布时间】:2016-09-30 10:49:51
【问题描述】:
我在尝试一个标准的面试题,就是以链表的形式添加两位数字,并返回添加的答案。问题来了:
给你两个链表,代表两个非负数。 数字以相反的顺序存储,它们的每个节点都包含 一个数字。将两个数字相加并作为链表返回。
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8
342 + 465 = 807 Make sure there are no trailing zeros in the output list So, 7 -> 0 -> 8 -> 0 is not a valid response even though值仍然是 807。
现在,我正在编写的代码采用ListNode 数据类型形式的两个参数,这是LinkedLists 的起始节点。我不明白的是
- 如何维护列表的头节点以供以后参考?
-
按值调用和按引用调用在 Java 中如何工作?我已经在 C++ 中处理了指针和引用调用,但我现在一直在尝试 Java 中的东西,它非常不同。
class ListNode { public int val; public ListNode next; ListNode(int x) { val = x; next = null; } } public class Solution { public ListNode reverse(ListNode head) { ListNode curr = head; ListNode next = null; ListNode prev = null; while (curr != null) { next = curr.next; curr.next = prev; prev = curr; curr = next; } head = prev; return head; } public ListNode addTwoNumbers(ListNode a, ListNode b) { ListNode node = null; ListNode head = null; boolean carry = false; while (a != null || b != null) { int f = 0, s = 0; if (carry) { f++; } carry = false; if (a != null) { f += a.val; a = a.next; } if (b != null) { s = b.val; b = b.next; } if (f + s > 9) { carry = true; } int curr = (f + s) % 10; node = new ListNode(curr); if (head == null) { head = node; } node = node.next; //warning that 'value of node assigned is never used' } if (carry) { node = new ListNode(1); } printList(head); return node; } }
【问题讨论】:
-
“Java 中按值调用和按引用调用如何工作”Java 始终是call-by-value。但是在这种情况下,“值”的含义是令人困惑的:传递的变量的值,它可能是一个引用。因此,虽然引用的对象不是按值传递的,但引用该对象的变量是;这意味着您不能像在 C++ 中那样在单独的方法中交换值。
-
@AndyTurner 在 Java 中处理诸如此类的 LinkedList 问题的最佳方法是什么?痛苦地维护 head 和其他值,因为在 Java 中,如果我只是简单地做
head = node,那么 head 的值会根据节点而变化,我最终无法检索 head 值。如何避免这种情况?
标签: java linked-list pass-by-reference