¥本文内容主要总结链表的的相关知识与常见题目
一、链表的定义
链表是线性表的链式存储的实现(物理顺序可以是任意的,不一定要与逻辑顺序一致)。线性表是指存储相同类型的一组数据,除了第一个和最后一个元素外,每一个元素都有它的一个直接前驱和直接后继,第一个元素有一个直接后继,最后一个元素有一个直接前驱。链表基本元素是结点,它里面包含数据域与指针域,结点之间用指针连接起来,形成一个简单的链。它有以下几种类型:
二、链表的分类
1.单链表
定义:单链表是指每一个结点只包含一个指针域的链表,这个指针指向当前节点的逻辑上的下一个节点,即该指针存储着下一个节点的地址。
public class LNode {
public int value;
public LNode next;
}
2.循环单链表
循环单链表与单链表的区别就在于它的最后一个节点的指针项指向该链表的头结点。(而非循环的单链表则的最后一个节点指针为null)
3.双向链表
与单链表不同,双向链表是指在链表的节点中设置两个指针域,一个指向当前节点的直接前驱,另一个指向它的直接后继。
public class DLNode {
public int data;
public DLNode prior;
public DLNode next;
}
4.循环双链表
循环双链表也是一个环形的链表。将头结点的前驱设置为尾节点,而尾节点的后继设置为头结点。
三、链表的基本操作
1.链表的插入
(1)单链表
在节点p后面插入一个元素e
//创建数据项为x的新结点
LNode q = new LNode();
q.value = x;
q.next = null;
//插入开始
q.next = p.next;//设置q的后继为p当前的后继
p.next = q;//更新p的后继为q
(2)双链表
在节点p后面插入一个元素x
//创建数据项为x的新结点
LNode q = new LNode();
q.value = x;
q.prior = null;
q.next = null;
//插入开始
q.prior = p;//设置q的前驱为p
q.next = p.next;//设置q的后继为p当前的后继
p.next.prior = q;//更新p的后继节点的前驱为q(之前是p)
p.next = q;//更新p的后继为q
2.链表的删除
(1)单链表
删除节点p后面的节点
int x = p.next.value;//保存要删除的节点内容
p.next = p.next.next;//直接更新p的后继为它当前后继的后继
(2)双链表
删除节点p后面的节点
int x = p.next.value;//保存要删除的节点内容
p.next.next.prior = p;//更新要删除的节点的后继节点的前驱为p
p.next = p.next.next;//更新p的后继为要删除的节点的后继
四、单链表的常见操作(由基本操作衍生)
0. 打印链表
就是简单把链表的元素逐个打印到屏幕上(方便后面测试)
public static void printLinkedList(LNode head){
//头结点不存数据
if(head == null){
System.err.println("Wrong input;");
return;
}
LNode p = head.next;
System.out.print("[");
while(p != null){
if(p.next == null){
System.out.println(p.value + "]");
break;
}else{
System.out.print(p.value+",");
}
p = p.next;
}
}
1. 头插法建立链表
即每次都插入到头结点的后面
public static LNode createLinkedListHead(){
Scanner sc = new Scanner(System.in);
LNode head = new LNode();
LNode p = head;
while(sc.hasNextInt()){
int data = sc.nextInt();
LNode q = new LNode();
q.value = data;
q.next = p.next;
p.next = q;
}
return head;
}
测试:
public static void main(String[] args){
LNode l = createLinkedListHead();
printLinkedList(l);
}
运行,依次在控制台输入:
1 2 3 4 5 6 ;
输出链表元素到屏幕:
[6,5,4,3,2,1]
2. 尾插法建立链表
public static LNode createLinkedListTail(){
Scanner sc = new Scanner(System.in);
LNode head = new LNode();
LNode p = head;
while(sc.hasNextInt()){
int data = sc.nextInt();
LNode q = new LNode();
q.value = data;
q.next = null;
p.next = q