Java 一维数组转换链表结构

最近在 Leetcode 刷题,发现遇到不少链表类型的题目,题目会定义好链表节点 ListNode 的数据结构。

ListNode

ListNode 的数据结构如下:

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

在题目的示例中,二叉树的输入都是一个一维数组,表示这个二叉树结构。

例如:

输入:root = [1,2,4]

表示的链表为:

image-20210304163859386

因此在 IDE 里面编码调试时,需要一个转化方法方便自己编写并运行测试用例。

转换链表

一维数组转换链表结构:

public class TreeNodeUtil {
    /**
     * 一维数组转换链表结构
     * @param array
     * @return
     */
    public static ListNode arrayToListNode(Integer[] array) {
        if (array.length == 0) {
            return null;
        }
        ListNode root = new ListNode(array[0]);
        ListNode other = root; //生成另一个节点,并让other指向root节点,other在此作为一个临时变量,相当于指针
        for (int i = 1; i < array.length; i++) { //由于已给root赋值,所以i从1开始
            ListNode temp = new ListNode(array[i]); //每循环一次生成一个新的节点,并给当前节点赋值
            other.next = temp; //将other的下一个节点指向生成的新的节点
            other = temp; //将other指向最后一个节点(other的下一个节点)  other=other.getNext();
        }
        return root;
    }
}

使用方式:

ListNodeUtil.arrayToListNode(new Integer[]{1,2,4});

测试用例

打印链表

ListNode p = ListNodeUtil.arrayToListNode(new Integer[]{1,2,4});
ListNodeUtil.print(p);

其中:

public static void print(ListNode node) {
    while (node != null) {
        System.out.print(node.val + ",");
        node = node.next;
    }
    System.out.println("");
}

比较链表

ListNode p = new ListNode(1,new ListNode(2,new ListNode(4,null)));
ListNode q = ListNodeUtil.arrayToListNode(new Integer[]{1,2,4});
System.out.println(ListNodeUtil.isSameListNode(p,q));

其中:

public static boolean isSameListNode(ListNode p, ListNode q) {
    if (p == null || q == null) {
        return p == q;
    }
    return p.val == q.val && isSameListNode(p.next, q.next);
}