Java中链表的操作

和c语言相比,Java取消了指针等机制,在对链表的使用上,看起来和Python一样简单。

新建一个链表:链表的结构

Java内置了链表这一数据结构,通过Listnode即可声明一个链表对象:

Listnode foo = new Listnode(0);

即使是自己定义链表对象,语法也很简单:

class ListNode {
	int val;
	ListNode next;
}

链表对象包括一个值,以及它指向的下一个列表。也就是说,list.next也是一个链表。这里似乎出现了节点和链表概念的混淆,有必要澄清:

  1. 链表是由节点构成的;
  2. 在Java中,链表是通过一连串的节点存储的,每一个节点存储了下一个节点的地址。通过不断的访问下一个节点的地址,可以读取链表的内容;
  3. 因此,在物理上只有节点被存储,只是通过数据结构的设计使得“链表”这一特殊结构能够被存储;
    下面用一个简单的例子来看链表的一些其他操作:

链表例题:合并两个链表

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 
输入: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;
    }
}

解题思路:

  1. 新建一个空链表bar作为dummyhead,其复制对象foo作为操作链表(的节点)
  2. 如果l1空了,则把l2的下一个节点直接接在foo的后面,这个节点包括了l2的剩余所有信息
  3. 比对l1和l2当前节点的值的大小,把较小的那个节点接在foo的后面;
    用一个更为直观的图来表述这一过程:
posted @ 2021-02-03 14:40  超载的巴赫朋克  阅读(1034)  评论(0编辑  收藏  举报