一.什么是链表?
链表是一种用于存储数据的数据结构,通过如链条一般的指针来连接元素。它的特点是插入与删
除数据十分方便,但寻找与读取数据的表现欠佳。
二.链表的结构
链表的核心是节点。一般节点包括数值部分和指针部分。
下面是节点定义:
这里以 LeetCode 中的题目为例:
java
public class ListNode {
public int val;//数值部分
public ListNode next;
public ListNode() {
}
public ListNode(int val) {
this.val = val;
}
@Override
public String toString() {
return "ListNode{" +
"val=" + val +
", next=" + next +
'}';
}
}
链表之间是通过指针相连,所以不需要像数组那样需要申请连续的一段空间,但是链表是没有索引的,所以查询连表中的某个节点就必须从头开始遍历链表找,所以查询速度没有数组快,但是对于中间节点的插入和删除,只需要断开连接部分,重新连接即可实现链表新节点的添加和删除,所以增删快。
三.链表增加数据
1.头插法
在链表头部插入数据。
java
//头插法
public void addFirst(int val) {
ListNode newNode=new ListNode(val);
if(head!=null){
newNode.next=head;
}
head=newNode;
size++;//链表长度
}
2.尾插法
在链表尾部插入数据
java
public void addLast(int val) {
ListNode newNode=new ListNode(val);
//如果头指针为空,那么新节点就是头节点
if(Objects.isNull(head)){
head=newNode;
}else{
ListNode curr=head;
while (curr.next!=null){
curr=curr.next;
}
curr.next=newNode;
}
size++;
}
3.在中间位置添加元素
java
public void add(int index, int val) {
//在第一个位置添加节点,可以直接调用addFirst()
if(index==0){
addFirst(val);
}
if(index<0 || index>=size){
throw new MyLinkException("索引越界");
}
ListNode curr=head;
ListNode newNode=new ListNode(val);
//这里因为是要拿到插入位置的前一个节点,又因为语句中是 curr=curr.next; 所以这里循环只需要到 index-1
for (int i = 0; i < index - 1; i++) {
curr=curr.next;
}
newNode.next=curr.next;
curr.next=newNode;
size++;
}
四.链表删除数据
1.删除头节点
java
public void removeFirst() {
head=head.next;
size--;
}
2.根据索引位置删除
java
public void remove(int index) {
ListNode first=head;
ListNode target;
ListNode second;
for (int i = 0; i < index - 1; i++) {
first=first.next;
}
target=first.next;
second=target.next;
first.next=second;
target.next=null;
size--;
}
3.根据值删除
java
Node pre = head;
if (data == head.data) {
removeFirst();
return true;
}
if (pre == null) throw new LinkedException("空链表删除失败");
while (pre.next != null) {
if (pre.next.data == data) {
Node target = pre.next;
Node next = target.next;
pre.next = next;
target.next = null;
return true;
}
pre = pre.next;
}
return false;
五.链表查找元素
1.根据索引查找
java
public int get(int index) {
ListNode curr=head;
for (int i = 0; i < index; i++) {
curr=curr.next;
}
return curr.val;
}
2.根据数据查找
java
public int indexof(int val) {
ListNode curr=head;
if(curr.val==val){
return 0;
}
int index=0;
for (int i = 0; i < size; i++) {
if(curr.val==val){
return index;
}
index++;
curr=curr.next;
}
return index;
}
六.链表修改节点
java
public void set(int index, int val) {
if(index<0 || index>size){
new MyLinkException("索引异常");
}
ListNode curr=head;
for (int i = 0; i < index; i++) {
curr=curr.next;
}
curr.val=val;
}