一、构造建表
链表结点包含数据域和指针域
JVM分为栈区和堆区,栈区存放引用地址,堆区存放对象实例
public class ListNode {
public int val;
public ListNode next;
public ListNode(int x) {
val = x;
next = null;
}
public static void main(String[] args) {
ListNode listnode=new ListNode(1);
}
}
二、遍历链表
从头到尾遍历链表,直到指针指向null即代表遍历完毕
/**
* 获取链表长度
*
* @param head 链表头节点
* @return 链表长度
*/
public static int getLength(Node head) {
int length = 0;
Node node = head;
//当前结点不为空
while (node != null) {
length++;
//指向下一个结点
node = node.next;
}
return length;
}
三、链表插入
(一)头部插入
注意:当插入新结点后,head应指向新结点
public static Node insertNode(Node head, Node nodeInsert) {
// 需要判空,否则后面可能会有空指针异常
if (head == null) {
return nodeInsert;
}
nodeInsert.next = head;
head = nodeInsert;
return head;
}
(二)中间插入
注意:应先将插入结点的next指向p.next,再改变p.next=nodeInsert。否则反过来会找不到原本p.next的地址
Node pNode = head;
int count = 1;
while (count < position - 1) {
pNode = pNode.next;
count++;
}
nodeInsert.next = pNode.next;
pNode.next = nodeInsert;
(三)尾部插入
创建新结点然后将尾结点指向p.next(null)
nodeInsert.next = pNode.next;
pNode.next = nodeInsert;
四、链表删除
没有被指向的对象会被JVM垃圾回收掉
(一)删除表头
head = head.next
(二)删除中间
目标位置结点的前一个结点
pre.next = pre.next.next
(三)删除尾结点
pre.next = null