📌  相关文章
📜  将 1 添加到表示为链表的数字(1)

📅  最后修改于: 2023-12-03 14:53:42.442000             🧑  作者: Mango

将 1 添加到表示为链表的数字

在软件开发中,很常见的一种数据结构是链表。而对于整数的表示,我们可以将其拆分成多个节点以形成一个链表。例如,数字 123 可以表示为一个链表 1 -> 2 -> 3。但是如果我们需要将一个整数加1,那么涉及到加法进位的问题,这时就需要考虑链表加1的算法实现。

下面我们就来介绍如何在链表表示的数字中将1加上。

算法思想

假设给定的表示为链表的数字是 $n$。最右边的节点表示最低位,每个节点只保存一个数字。将该数加 $1$ 后,可能会出现进位,因此我们需要从最低位开始依次判断是否需要进位,直到遍历到最高位为止。

实现步骤
  1. 初始化一个额外的节点作为头结点,将其 next 指向原始的链表表示的数字 $n$。
  2. 初始化两个指针 $p$ 和 $q$,均指向头结点。
  3. 遍历链表,判断每个节点是否需要加1。
  4. 如果某个节点需要加1且不产生进位,则更新节点的值;如果某个节点需要加1且产生进位,则更新该节点的值为 0,然后继续遍历下一个节点。
  5. 如果遍历到头结点 $p$,并且该节点的值为 0,则说明原始链表中的值全部为 9,且加1后需要增加一个节点。
  6. 遍历完链表后,如果 p 的值为头结点,则返回头结点的 next 指向,否则直接返回头结点。
代码实现

以下是 Java 语言实现的代码示例:

class ListNode {
    int val;
    ListNode next;
    ListNode(int x) { val = x; }
}

public class Solution {
    public ListNode plusOne(ListNode head) {
        ListNode dummy = new ListNode(0); // 头结点
        dummy.next = head;
        ListNode p = dummy, q = dummy;

        while (p.next != null) {
            p = p.next;
            if (p.val != 9) q = p;
        }

        if (p.val != 9) {
            p.val++; // 不需要进位
        } else {
            q.val++;
            q = q.next;
            while (q != null) {
                q.val = 0;
                q = q.next;
            }
        }

        if (dummy.val == 0) return dummy.next; // 不需要增加节点
        return dummy; // 需要增加节点
    }
}
总结

链表加1的算法实现虽然看起来比较简单,但也需要注意细节。需要从低位到高位遍历链表,并考虑进位的问题。实现时最好增加一个头结点方便处理。在实际开发中,我们还需要注意对于特殊情况的处理,如链表为空、链表中所有节点的值都为9等情况。