链表的内部结构
什么是链表,链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思)。
链表的入口节点称为链表的头结点也就是head。
如图所示:
注意:这里的next,记录的是下一个链表的地址,并不是像数组一样是直接、连续的结构。
链表类型
单链表
下面是Java中单链表的结构定义:
public class ListNode{
//节点的值
int val ;
//下一个结点
ListNode next;
//结点的构造参数(无参)
public ListNode(){}
//结点的构造函数,一个参数
public ListNode(int val) {
this.val = val;
}
//结点的构造函数 两个参数
public ListNode(int val, ListNode next) {
this.val = val;
this.next = next;
}
}
如图所示:
插入结点
插入结点分为三种情况,从链表头部插入、从链表中间插入或者从链表后插入。
(1)从链表中间插入:
先遍历到要插入点的位置。将该位置结点的前结点的指针指向该节点,该节点的指针指向后面节点的一个位置。
如图所示:
(2)从链表头部插入
直接将插入的结点的下一个指针指向前头结点。
代码
/**
* 在指定位置插入一个结点
* @param node 链表头结点
* @param nodeInsert 待插入链表
* @param index 待插入位置 从1开始
* @return
*/
public static ListNode AddElement(ListNode node,ListNode nodeInsert,int index){
if (node == null){
return nodeInsert;
}
ListNode dumy = new ListNode();
//设置虚拟头结点
dumy.next = node;
ListNode cur = dumy;
ListNode temp = null;
int size = 0;
while (cur != null && cur.next !=null){
cur = cur.next;
size++;
if (size == index){
temp = cur.next;
cur.next = nodeInsert;
nodeInsert.next = temp;
}
}
return dumy;
}
删除结点
将需要删除的结点’'空出来",即可完成删除该节点。同样也需要考虑到表头结点、最后一个结点、中间结点的情况。
(1)删除表头结点
删除表头结点,需要将head = head.next,新头结点就是原结点的第二个结点。
(2)删除最后一个结点
将最后一个结点的前结点指针指向null,即可。
(3)删除中间结点
找到位置后,cur.next = cur.next.next,即可。
注意:cur为需要删除结点的上一个结点。因为单链表,只有前找后,没有后找前。
如图所示:
代码
public static ListNode deleteElement(ListNode node,int index){
if (node == null){
return null;
}
ListNode dumy = new ListNode();
ListNode cur = dumy;
dumy.next = node;
int size = 0;
while (cur!=null && cur.next != null){
cur = cur.next;
size++;
if (size == index){
cur.next = cur.next.next;
}
}
return dumy;
}
双链表
下面是Java中双链表的结构定义:
public class DoubleNode {
//数据域
public int data;
//指向下一个结点
public DoubleNode next;
//指向上一个结点
public DoubleNode prev;
public DoubleNode(int data){
this.data = data;
}
public DoubleNode(int data,DoubleNode next){
this.data = data;
this.next = next;
}
public DoubleNode(int data,DoubleNode next,DoubleNode prev){
this.data = data;
this.next = next;
this.prev = prev;
}
}
如图所示: