链表是一种非常常见的数据结构,是必须掌握的
链表每一个节点在内存中分布并不是线性的是随机的,是通过数据结构中的next将下一节点与当前节点产生联系,进而连成一个串的,类似下图
菱形代表所存位置的内存值,方块代表每一个链表节点
public class ListNode {
public int val;//当前节点的值
public ListNode next;//记录下一节点
//下面三个函数是java的构造函数,方便快速赋值
public ListNode(){}
public ListNode(int val){ this.val = val; }
public ListNode(int val,ListNode next){this.val = val;this.next = next;}
@Override
public String toString() {//重写了一个输出方法,方便看
return "ListNode{" +
"val=" + val +
", next=" + next +
'}';
}
}
头插法:
public static void main(String[] args) {
int[] arr = {1,2,3,4,5};
//头插法
ListNode l1 = new ListNode(arr[0]);
for (int i = 1; i <arr.length ; i++) {
ListNode no = new ListNode(arr[i]);//产生一个新的节点
no.next = l1;//新节点的next指向链表的头
l1 = no;//更新链表的头
}
}
尾插法:
public static void main(String[] args) {
//尾插法,头要返回不能动,所以用tail来移动
int[] arr2 = {1,2,3,4,5};
ListNode head=null,tail=null;//定义两个指针
for (int i = 0; i < arr2.length; i++) {
ListNode no = new ListNode(arr[i]);//产生一个新节点
if(head==null){
head= no;
tail = head;
}else {
tail.next = no;//链表尾节点的next指向新的no
tail = tail.next;更新尾节点
}
}
System.out.println(head);
}