一、链表的概念:
链表将每个对象存放在独立的节点中,每个节点还存放着序列中下一个节点的引用。在Java中,所有链表实际上都是双向链接的——即每个节点还存放着指向前驱节点的引用。
双向链表结构如下所示:
二、链表的特点:
获取数据慢,需要遍历查找;插入和删除快,只需要修改前后的链接。
三、单链表的实现:
1、定义节点类:
public class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
next = null;
}
}
2、实现单链表:
public class SingleLinkedList {
ListNode head = null;
/**
* 添加头节点
*/
public void addHead(int x){
ListNode node = new ListNode(x);
node.next = head;
head = node;
}
/**
* 添加尾节点
*/
public void addLast(int x){
ListNode node = new ListNode(x);
ListNode temp = head;
while (temp.next != null){
temp = temp.next;
}
temp.next = node;
}
/**
* 链表长度
*/
public int length(){
int length = 0;
ListNode tem = head;
while (tem != null){
length++;
tem = tem.next;
}
return length;
}
/**
* 打印节点值
*/
public void printNode(){
ListNode node = head;
while (node != null){
System.out.print(node.val+",");
node = node.next;
}
System.out.println();
}
/**
* 根据下标删除节点
* @param index
*/
public void deleteNode(int index){
ListNode node = head;
if (index<0 || index>length()){
System.out.println("下标错误!!!!");
return;
}else if (index == 0){
head = head.next;
}else {
for (int i = 1; i < index; i++) {
node = node.next;
}
//跳过index项的node
node.next = node.next.next;
}
}
}
3、方法测试:
public static void main(String[] args) {
SingleLinkedList linkedList = new SingleLinkedList();
linkedList.addHead(2);
linkedList.addHead(3);
linkedList.addLast(1);
System.out.println("------添加节点------");
linkedList.printNode();
linkedList.deleteNode(1);
System.out.println("------删除节点-------");
linkedList.printNode();
System.out.println(linkedList.length()+"---节点长度----");
}
4、控制台输出:
------添加节点------
3,2,1,
------删除节点-------
3,1,
2---节点长度----