在前段时间集中做了leetcode上树的相关的题目之后,最近准备做链表相关的题目了。与之前的问题相同,如果每次测试代码的时候,自己创建测试用例,或者调用leetcode给的例子,都要手动去创建一个链表的话,效率未免太低,也会打断做题时候的思路,因此,也整理出了一个用来创建链表的代码,贴出来以供参考。
相关文章
这里有可以参考的创建和直观展示一棵树的方法:
如何直观地打印一棵树
如何直观地创建一棵树
然后是可以直观地打印出一棵树的代码,在本文中也会用到(为方便读者使用,已经将这些代码集成在本文的代码中了,共同作为工具类的方法):
如何直观地打印一个链表
如何创建一个链表
由int数组创建链表
首先,我们先写一个方法,来实现最简单的,由一个给定的数组来创建一个链表:
// 通过数组来构建链表
public static ListNode constructList(int[] nums) {
ListNode dummy = new ListNode(-1);
ListNode preNode = dummy;
for (int i = 0; i < nums.length; i ++) {
ListNode currNode = new ListNode(nums[i]);
preNode.next = currNode;
preNode = preNode.next;
}
return dummy.next;
}
在这个方法中,我们只需要遍历输入的数组,然后根据各个元素创建链表的节点的对象,然后把各个对象链接起来即可。这里用了一个小技巧,就是使用了一个dummy作为链表的起始节点,这样的目的是,使后面所有节点的操作完全相同,否则链表中的第一个节点的操作肯定是与其它节点不同的,这样可以减少冗余代码,提高效率(不同多次判断是否为头节点),并且即使为空,输出的方法也不会改变。
由字符串创建链表
在上面一节,我们有了通过int数组得到了链表的方法,但是实际中更常见的情况是,要通过从网页上复制下来的字符串来构建链表,而字符串又有多种形式,如:
"1->2->3->4->5->NULL"
"[1, 2, 3, 4 ,5]"
有的是用箭头来表示,有的是用一个数组的形式(的字符串)来表示,有的带NULL,有的不带,有的用空格隔开,有的没有,因此,仅仅有上面的由整型数组构建链表的方法远远不够,我们需要一个能够适配更多种形式的字符串的方法才能应对这些情况。
但是,因为我们有了上面的这个方法,因此,可以用统一的思路,即先将字符串处理成整型数组,再调用上面的constructList(int[] nums)
来得到链表。
在这里,对于多种字符串的形式做了适配,具体如下:
- 允许的字符串形式:
"1->2->3->4->5->NULL"
"1->2->3->4->5"
"[1, 2, 3, 4 ,5]"
"[1, 2, 3, 4 ,5, NULL]"
- 注意:
1)字符串前后可以有空格
2)NULL为大写或小写均可
在下面,将最后的代码贴了出来:
// ListOperation.java
public class ListOperation {
// 直观地打印出链表
public static void show(ListNode head)