实例
在定义链表时,我们常常需要定义一个内部类用以表示结点。
如下图就是MySingleList的定义以及部分方法
public class MySingleList {
//代表当前列表的头结点的引用
public Node head;
//定义一个Node内部类
class Node {
public int val;
public Node next;
//构造方法
public Node(int val) {
this.val = val;
this.next = null;
}
public Node() {
}
}
//头插法 O(1)
public void addFirst(int data) {
Node node = new Node(data);
node.next = this.head;
this.head = node;
}
//从任意位置开始打印
public void display(Node node) {
Node cur = node;
while (cur != null) {
System.out.print(cur.val + " ");
cur = cur.next;
}
System.out.println();
}
}
当我们在实现两个有序链表的合并的时候,需要返回合并后的链表的头结点,那么如何打印这个合并后的链表呢。
public class Test {
public static MySingleList.Node mergeTwoLists(MySingleList mySingleList1,MySingleList mySingleList2){
MySingleList.Node cur1 = new MySingleList().new Node();
MySingleList.Node cur2 = new MySingleList().new Node();
cur1 = mySingleList1.head;
cur2 = mySingleList2.head;
MySingleList.Node newhead = new MySingleList().new Node(-1);
MySingleList.Node pre = newhead;
while(cur1 != null && cur2 != null ){
if(cur1.val <= cur2.val ) {
pre.next = cur1;
pre = pre.next;
cur1 = cur1.next;
}
else{
pre.next = cur2;
pre = pre.next;
cur2 = cur2.next;
}
}
if(cur1 != null){
pre.next = cur1;
}
else{
pre.next = cur2;
}
return newhead.next;
}
public static void main(String[] args) {
MySingleList mySingleList1 = new MySingleList();
//头插法
mySingleList1.addFirst(7);
mySingleList1.addFirst(5);
mySingleList1.addFirst(3);
mySingleList1.addFirst(1);
mySingleList1.display(mySingleList1.head);//此时打印时只会打印1234
MySingleList mySingleList2 = new MySingleList();
//头插法
mySingleList2.addFirst(8);
mySingleList2.addFirst(6);
mySingleList2.addFirst(4);
mySingleList2.addFirst(2);
mySingleList1.display();
mySingleList2.display();
//合并两个有序链表,并返回新的链表的头节点
MySingleList.Node ret = mergeTwoLists(mySingleList1,mySingleList2);
//从指定位置打印链表
mySingleList2.display(ret);//输出结果是12345678
mySingleList1.display(ret);
mySingleList1.display(mySingleList1.head);//此时会打印12345678
}
}
尤其注意最后两句mySingleList2.display(ret.next); mySingleList1.display(ret.next);
两句执行结果是一摸一样的。
注意这里的逻辑。类名.方法(形参),这里面的我们往往的写代码的逻辑时形参指向的内容以及方法所执行的对象都必须全部包含在这个类名所引用的对象里,就像在设计这个代码的时候我总想初始化出合并后的 mySingleList
,也就是这个链表对象,用这个链表对象调用display才对。其实根本不用这样。
所以前后两句mySingleList1.display(mySingleList1.head)
输出结果是不一样的,display的执行只与mySingleList1.head
指向有关,mySingleList1
还是mySingleList2
只是起一个引用作用
D:\java_code\linklist\src\demo1\Test.java 210()