单向链表
单向链表
链表是有序的列表,内存存储如下:

- 链表是以节点为单位来进行数据的存储,是链式存储
- 每个节点包含data域—存储数据;next域-指向下一个节点 且每个节点本身有个内存地址空间。
- 链表中各个节点并不一定是连续存储。
- 链表分带头节点的链表和不带头节点的链表。
单链表应用实例
使用带head头节点的单向链表实现水浒英雄排行榜管理完成对英雄人物的增删改查操作。
思路分析
-
创建节点,包括数据域,next域
-
添加数据(即一个节点):在链表中找到要添加的位置。
有两种方式:
方式1:在链表尾部添加,判断是否到链表尾(通过一个辅助变量来遍历链表,temp.next=null);
方式2:在指定位置添加(编号添加)首先找到插入的指定位置(N.no<temp.next);将新的节点插入N.next=temp.next;temp.next=N;
-
修改节点功能:通过遍历找到该节点。修改节点的信息。
-
删除节点:通过遍历找到删除的节点。temp.next=temp.next.next;被删除的节点,将不会有新的指向,将会直接被垃圾回收机制回收。
-
查看数据:通过遍历找到要查看的数据。输出查看的节点信息。
注意
- 添加节点 删除节点都是找到前一个节点(temp=head);
- 查看 修改节点都是对当前的节点进行操作(temp=head.next);
- 利用while()循环遍历整个链表,定义一个标志位,记得跳出循环。
package 链表;
public class 单向链表 {
public static void main(String[] args) {
//进行测试,先创建节点
Node N1=new Node("宋江",1);
Node N2=new Node("卢俊义",2);
Node N3=new Node("吴用",3);
Node N4=new Node("林冲",4);
//创建链表,添加节点到链表
Linklist list=new Linklist();
list.add1(N1);
list.add1(N2);
list.add1(N3);
list.add1(N4);
list.show();
//修改节点信息
Node N5=new Node("豹子头-林冲",4);
list.change(N5);
list.show();
//删除节点
list.dele(2);
list.show();
}
}
//创建节点
class Node {
public String name;
public int No;
public Node next;
public Node() {
}
public Node(String name, int no) {
this.name = name;
No = no;
}
}
//链表管理类
class Linklist {
//定义头节点
private Node head = new Node();//默认为空
//添加数据
public void add1(Node N) {//在末尾直接添加
Node temp = head;//定义一个临时变量,用来遍历链表
//找到链表的尾部,插入节点
while (true) {
if (temp.next == null) {
break;
}
temp = temp.next;
}
//当退出while循环时,temp就找到了链表的最后。
temp.next = N;
}
public void add2(Node N) {//在指定位置添加
Node temp = head;//定义一个临时变量,用来遍历链表
boolean flag = false;
//当循环结束时,有没有找到指定位置通过flag标签来标记
while (true) {
if (temp.next == null) {//如果链表为空,则直接在链表尾部添加
break;
}
if (N.No < temp.next.No) {
break;
} else if (N.No == temp.next.No) {
flag = true;
break;
}
temp = temp.next;
}
if(flag){//不能添加,说明编号已经存在
System.out.println("编号已经存在;无法添加");
}
else{
N.next=temp.next;
temp.next=N;
}
}
//删除节点
public void dele(int N) {
Node temp = head;//定义一个临时变量,用来遍历链表
boolean flag=false;
//找到要删除的节点
while(true){
//判断链表是否为空
if (temp.next == null) {
System.out.println("链表为空,无法删除");
break;
}
if(temp.next.No==N){
flag=true;
break;
}
temp = temp.next;
}
if (flag) {
temp.next = temp.next.next;
}
else{
System.out.println("无法删除");
}
}
//查看链表信息
public void show() {
//判断链表是否为空
if(head.next==null){
System.out.println("链表为空");
return;
}
Node temp=head.next;
while(true){
if(temp==null){
break;
}
System.out.println(temp.No+"+"+temp.name);
temp = temp.next;
}
}
//修改链表信息
public void change(Node N) {
//判断链表是否为空
if(head.next==null){
System.out.println("链表为空");
return;
}
//找到要修改的节点,根据编号来修改
//定义一个辅助变量
Node temp=head.next;
boolean flag=false;
//遍历完找到要修改的节点
while(true){
if(temp==null){//找到链表的最后
break;
}
if(N.No==temp.No){//找到要修改的链表
flag=true;
break;
}
temp=temp.next;
}
if(flag){
temp.name=N.name;
}
else{
System.out.println("无法修改");
}
}
}
参考资料:尚硅谷—数据结构与算法

浙公网安备 33010602011771号