📅  最后修改于: 2023-12-03 14:56:24.455000             🧑  作者: Mango
本文介绍了如何用链表表示两个数字,并进行相减操作的Java程序。
我们可以使用链表来表示一个数字,链表的每个节点代表数字的一位。链表的头节点表示最高位,链表的尾节点表示最低位。
为了实现相减操作,我们需要考虑以下几个步骤:
下面是用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
方法接受两个链表参数num1
和num2
,返回结果链表。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程序。该程序可以灵活处理不同长度的链表,并返回正确的结果链表。