📌  相关文章
📜  用链表表示的两个数字相减的Java程序(1)

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

用链表表示的两个数字相减的Java程序

简介

本文介绍了如何用链表表示两个数字,并进行相减操作的Java程序。

链表表示数字

我们可以使用链表来表示一个数字,链表的每个节点代表数字的一位。链表的头节点表示最高位,链表的尾节点表示最低位。

相减操作实现

为了实现相减操作,我们需要考虑以下几个步骤:

  1. 遍历两个链表,获取它们的长度。
  2. 在较短的链表前面补0,使得两个链表长度相等。
  3. 从最低位开始,依次对对应的节点值进行相减操作:
    • 如果当前位的差大于等于0,直接将差值存储到结果链表中。
    • 如果当前位的差小于0,向高位借1,并将差值加上10存储到结果链表中。
  4. 最后,可以去掉结果链表前面的多余的0。

下面是用Java实现相减操作的代码:

class ListNode {
    int val;
    ListNode next;

    public ListNode(int val) {
        this.val = val;
    }
}

public class SubtractLinkedListNumbers {
    public ListNode subtract(ListNode num1, ListNode num2) {
        int len1 = getLength(num1);
        int len2 = getLength(num2);

        // 补0,使得两个链表等长
        if (len1 < len2) {
            num1 = addZeros(num1, len2 - len1);
        } else if (len1 > len2) {
            num2 = addZeros(num2, len1 - len2);
        }

        ListNode result = new ListNode(0);
        ListNode current = result;

        // 相减操作
        while (num1 != null && num2 != null) {
            int diff = num1.val - num2.val;

            if (diff >= 0) {
                current.next = new ListNode(diff);
            } else {
                num1.val += 10;
                current.next = new ListNode(num1.val - num2.val);
            }

            current = current.next;
            num1 = num1.next;
            num2 = num2.next;
        }

        // 去掉前面多余的0
        result = result.next;

        // 返回结果链表
        return result;
    }

    private int getLength(ListNode node) {
        int length = 0;
        while (node != null) {
            length++;
            node = node.next;
        }
        return length;
    }

    private ListNode addZeros(ListNode node, int zeros) {
        while (zeros > 0) {
            ListNode zeroNode = new ListNode(0);
            zeroNode.next = node;
            node = zeroNode;
            zeros--;
        }
        return node;
    }
}

此处的ListNode类表示链表节点,subtract方法接受两个链表参数num1num2,返回结果链表。getLength方法用于获取链表长度,addZeros方法用于在较短的链表前面补0。

使用示例

以下是使用示例,演示了如何创建链表、调用相减方法并输出结果:

public class Main {
    public static void main(String[] args) {
        SubtractLinkedListNumbers subtractor = new SubtractLinkedListNumbers();

        // 创建链表:936
        ListNode num1 = new ListNode(9);
        num1.next = new ListNode(3);
        num1.next.next = new ListNode(6);

        // 创建链表:245
        ListNode num2 = new ListNode(2);
        num2.next = new ListNode(4);
        num2.next.next = new ListNode(5);

        ListNode result = subtractor.subtract(num1, num2);

        // 输出结果链表
        while (result != null) {
            System.out.print(result.val + " ");
            result = result.next;
        }
    }
}

输出结果为:6 9 1,表示链表936和链表245相减等于691。

结论

通过以上步骤,我们成功实现了用链表表示的两个数字相减的Java程序。该程序可以灵活处理不同长度的链表,并返回正确的结果链表。