链表
链表是一种物理存储单元上非连续的、非顺序的物理存储结构,数据元素的逻辑顺序是通过链表中的指针的链接顺序来实现的。链表中的每个元素称之为结点,链表由结点组成,结点可以在运行时动态生成。每个结点由两部分组成:一个是存储数据元素的数据域,另一部分是存储下一个数据元素地址的指针域。
简单理解,链表由多个结点构成,除过尾节点每一个结点都存储着下一个结点的地址,依次链接,成为链式结构。
Java中没有链表,需要自定义一个链表类ListNode
public class ListNode {
int val;
ListNode next; // 下一个链表对象
ListNode(int x) { val = x; } //赋值链表的值
}
public static void main(String[] args) {
//创建4个结点,分别为结点赋值
ListNode head = new ListNode(0);
ListNode fristNode = new ListNode(1);
ListNode secondNode = new ListNode(2);
ListNode ThirdNode = new ListNode(3);
//将每个结点都给连起来,形成链表结构
head.next=fristNode;
fristNode.next=secondNode;
secondNode.next=ThirdNode;
//调用方法
testMethod(head);//ThirdNode:3
}
//静态方法可直接调用
public static void testMethod(ListNode l1){
System.out.println("ThirdNode:"+l1.next.next.next.val);
}
简单认识链表后,可以看一道LeetCode上的题目:
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
public static ListNode add(ListNode l1, ListNode l2) {
// 最低位的进位值
int carry = 0;
// 建立两个引用,一个指向链表头,用于返回,另一个不断移动,用于建立链表
ListNode result = new ListNode(0);
ListNode l3 = result;
// 累加条件:两个链表都没有到末尾
while (l1 != null || l2 != null){
// 判断是否有高位为零
int l1val = l1 != null ? l1.val : 0;
int l2val = l2 != null ? l2.val : 0;
int sum = l1val + l2val + carry; //计算累加和 7
carry = sum / 10; // 计算进位 0
sum = sum % 10; // 计算余数 7
l3.next = new ListNode(sum); //计算结果存放到链表下一个节点 7
l3 = l3.next; // 引用递归 0
// 如果没有到链表尾部,则递归引用
if (l1 != null) l1 = l1.next; //
if (l2 != null) l2 = l2.next; //
}
// 判断最后一次累加是否有进位
if (carry > 0)
{
l3.next = new ListNode(1);
}
return result.next; //返回当前0值的下一个节点,即最终结果
}
注意事项:
- 两条链表的长度不一样,就会出现一条为null,另一条还有数字
- 进位的处理,最后一次的相加,对于进位的判断需要放在循环外