1、链表(LinkedList)介绍
1.1、什么是链表
链表(linked list)是⼀种在物理上 ⾮连续、 ⾮顺序的数据结构,由若⼲节点 (node)所组成。链表中数据元素的逻辑顺序是通过链表中的指针链接次序实现 的。链表由⼀系列结点(链表中每⼀个元素称为结点)组成,结点可以在运⾏时动 态⽣成。每个结点包括两个部分:⼀个是存储数据元素的数据域,另⼀个是存储下 ⼀个结点地址的指针域。
1.2、单向链表:
单链表的第⼀个节点的存储位置叫做头指针,最后⼀个节点的后继指针为空,⼀般 ⽤ NULL 或者 “^” 表示。
除了上⾯的,有时候为了操作⽅便,会在单链表的第⼀个节点前⾯加⼀个节点,称 之为头节点。这个头节点⼀般不存储任何内容,它的指针域指向单链表的第⼀个节 点。
单向链表代码初始化:
1.2.1、单向链表代码实现
//单向链表常用操作
//定义链表
public class ListNode {
//数据域
Integer data;
//指针域,指向下⼀个节点
public ListNode next;
//节点的构造函数(无参)
public ListNode() {
}
// 节点的构造函数(有一个参数)
public ListNode(int data) {
this.data = data;
}
// 节点的构造函数(有两个参数)
public ListNode(int data, ListNode next) {
this.data = data;
this.next = next;
}
/**
* 1、向链表尾部添加结点
* @param data 结点的值
*/
public static void addData(ListNode head,int data){
//初始化要加入的结点
ListNode newNode=new ListNode(data);
//临时结点
ListNode temp=head;
if(temp==null){
head=newNode;
}
//找到尾结点
while(temp.next!=null){
temp=temp.next;
}
//添加结点
temp.next=newNode;
}
/**
* 2、插入结点
* @param head 头结点
* @param data 插入结点的值
* @param index 插入结点的位置(放到原来结点的前面)(从0开始)
*/
public static void insertNode(ListNode head,int data,int index){
//新建预插入的结点
ListNode newNode=new ListNode(data);
//临时虚拟头结点
ListNode temp=head;
//记录结点的位置
int current=0;
while(temp!=null){
//得到前一个结点
if(current==(index-1)){
newNode.next=temp.next;
temp.next=newNode;
}
current++;
temp=temp.next;
}
}
/**
* 3、获取链表的长度
* @param head
* @return
*/
public static int linkedListLen(ListNode head){
//记录链表的长度
int len=0;
//临时头结点
ListNode temp=head.next;
while(temp!=null){
len++;
temp=temp.next;
}
return len;
}
/**
* 4、根据位置删除结点
* @param head 头结点
* @param index 删除的位置(从0开始)
*/
public static void deleteNode(ListNode head,int index){
//临时虚拟头结点
ListNode temp=head;
//记录当前遍历的位置
int current=0;
while(temp!=null){
if(current==(index-1)){
temp.next=temp.next.next;
}
current++;
temp=temp.next;
}
}
public static void main(String[] args) {
//虚拟头结点
ListNode head=new ListNode();
addData(head,7);
addData(head,9);//7,9
insertNode(head,6,1);//6,7,9
deleteNode(head,1);//7,9
int len = linkedListLen(head);//2
System.out.println("链表长度为"+len);//2
System.out.println("分别为:");
ListNode temp=head.next;
//遍历链表
while(temp!=null){
int date=temp.data;
System.out.println(date);//6,8,9
temp=temp.next;
}
}
}
1.3、双向链表
双向链表,顾名思义,两个⽅向向的链表。相⽐起单链表来说,它多了⼀个前驱指 针 prev,指向前驱节点。这样双向链表既可以往前⾛,也可以往后⾛。
1.4、循环链表
链表的尾节点指向头节点形成⼀个环,称为循环链表