Java中链表的操作
和c语言相比,Java取消了指针等机制,在对链表的使用上,看起来和Python一样简单。
新建一个链表:链表的结构
Java内置了链表这一数据结构,通过Listnode
即可声明一个链表对象:
Listnode foo = new Listnode(0);
即使是自己定义链表对象,语法也很简单:
class ListNode {
int val;
ListNode next;
}
链表对象包括一个值,以及它指向的下一个列表。也就是说,list.next
也是一个链表。这里似乎出现了节点和链表概念的混淆,有必要澄清:
- 链表是由节点构成的;
- 在Java中,链表是通过一连串的节点存储的,每一个节点存储了下一个节点的地址。通过不断的访问下一个节点的地址,可以读取链表的内容;
- 因此,在物理上只有节点被存储,只是通过数据结构的设计使得“链表”这一特殊结构能够被存储;
下面用一个简单的例子来看链表的一些其他操作:
链表例题:合并两个链表
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-two-sorted-lists
代码如下:
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode bar = new ListNode(0);
ListNode foo = bar;
while(l1 != null && l2 != null) {
if(l1.val < l2.val) {
foo.next = l1;
foo = foo.next;
l1 = l1.next;
}
else {
foo.next = l2;
foo = foo.next;
l2 = l2.next;
}
}
if(l1 == null) {
foo.next = l2;
}
else {
foo.next = l1;
}
return bar.next;
}
}
解题思路:
- 新建一个空链表bar作为dummyhead,其复制对象foo作为操作链表(的节点)
- 如果l1空了,则把l2的下一个节点直接接在foo的后面,这个节点包括了l2的剩余所有信息
- 比对l1和l2当前节点的值的大小,把较小的那个节点接在foo的后面;
用一个更为直观的图来表述这一过程: