目录
单链表的概念
单链表是链表的其中一种基本结构。在结点中数据域用来存储数据元素,指针域用于指向下一个具有相同结构的结点。
因为只有一个指针结点,称为单链表。
单链表结构
单链表的实现
封装节点类
package com.mine.list;
public class ListNode {
int value;//节点的值
ListNode next;//记录下一个节点的地址 --------》java强类型,定义什么类型就在内存中开辟什么空间
//构造器
public ListNode(int value){
this.value = value;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
public ListNode getNext() {
return next;
}
public void setNext(ListNode next) {
this.next = next;
}
@Override
public String toString() {
return "ListNode{" +
"value=" + value +
", next=" + next +
'}';
}
}
普通方式实现链表
package com.mine.list;
public class Test {
public static void main(String[] args) {
//创建节点
ListNode node1 = new ListNode(1);
ListNode node2 = new ListNode(1);
ListNode node3 = new ListNode(1);
ListNode node4 = new ListNode(1);
ListNode node5 = new ListNode(1);
ListNode node6 = new ListNode(1);
//手动规定每个节点的下一个节点来构建链表
node1.next = node2; //java中 = 是值传递
node2.next = node3;
node3.next = node4;
node4.next = node5;
node5.next = node6;
//打印链表,只要打印头结点,头结点会根据存储的下个结点的地址打印出下个结点,直到某个结点存储的下个结点地址为空
System.out.println(node1);
}
}
执行结果
手动构建链表太过复杂,可以使用一个链表管理类,在里面编写方法来实现自动构建链表
创建链表管理类
尾插法
顾名思义,在链表尾部插入新的节点
package com.mine.list;
/**
* 链表管理类
*/
public class LinkList {
public void insert(int value) {
//使用传入的参数创建一个结点
ListNode listNode = new ListNode(value);
//头结点为空则将当前节点置为头结点
if (head == null) {
head = listNode;
return;
}
//创建一个游标结点,用来从头结点开始遍历当前链表
ListNode indexNode = head;
//只要结点的下一个结点不空就会一直向后遍历
while (indexNode.next != null) {
indexNode = indexNode.next;
}
//某个结点的下个结点为空跳出循环后,让该节点指向新创建的节点··结点
indexNode.next = listNode;
}
}
测试
LinkList linkList = new LinkList();
//尾插法
linkList.insert(1);
linkList.insert(2);
linkList.insert(3);
linkList.insert(4);
linkList.insert(5);
System.out.println(linkList.head);
结果
头插法
总是将新结点置为头结点,原链表放在该节点后
/**
* 头插法
*
* @param value
*/
public void HeadInsert(int value) {
//创建节点
ListNode listNode = new ListNode(value);
if (head == null) {
head = listNode;
return;
}
//将原有链表连在新结点后面
listNode.next = head;
//将新结点置为头结点
head = listNode;
}
测试
LinkList linkList = new LinkList();
//头插法
linkList.HeadInsert(1);
linkList.HeadInsert(2);
linkList.HeadInsert(3);
System.out.println(linkList.head);
结果
打印链表的值
/**
* 输出链表节点上的值
*/
public void printLink() {
ListNode indexNode = head;
while (indexNode != null) {
System.out.println(indexNode.value);
indexNode = indexNode.next;
}
}
测试与结果
LinkList linkList = new LinkList();
//尾插法
linkList.insert(1);
linkList.insert(2);
linkList.insert(3);
linkList.insert(4);
linkList.insert(5);
linkList.printLink();