什么是链表
- 链表是以节点的方式进行存储的,是链式存储
- 每个节点包含date域和next域:指向下一个节点
- 链表的各个节点不一定是连续的,这样做的作用的更好的利用碎片化的内存
- 单向链表分为带头节点和不带头节点,根据需求自定义就可以
代码实现
单向链表实现 –水浒英雄排行榜管理完成对英雄人物的增删改查操作
1.创建节点Node类
package com.csdn.linkedlist;
/**
*创建节点,此例子链表存储的为绿林好汉,并能存储下一个节点的地址
*/
public class Node {
String name;//名字
String nikeName;//昵称
Integer no;//排名
Node next;//存储下个节点位置
public Node(String name, String nikeName, Integer no) {
this.name = name;
this.nikeName = nikeName;
this.no = no;
}
public Node() {
}
@Override
public String toString() {
return "Node{" +
"name='" + name + '\'' +
", nikeName='" + nikeName + '\'' +
", no=" + no +
'}';
}
}
2.创建链表类
public class LinkedLiset {
Node head;//
//无参构造方法,链表创建时,创建链表头
public LinkedLiset() {
this.head = new Node(null, null, 0);
}
}
3,无脑增加节点方法add
我们只要找到最后一个节点,将节点的next属性指向我们传递的参数 就可以
//增加
public void add(Node node) {
Node temp = head;//创建辅助节点
//找到链表的最后一个节点
while (true) {
if (temp.next == null) {
break;
}
temp = temp.next;
}
temp.next = node;
}
4.遍历方法show()
//遍历
public void show() {
Node temp=head.next;//找到一个有效节点
if (temp==null){//如果为空,证明为空节点直接结束方法
System.out.println("linkedlist is empety");
return;
}
while (true){//循环遍历 输出前判断节点是否有效
if (temp==null){
break;
}
System.out.println(temp);
temp=temp.next;
}
}
5修改方法udate()
//根据no修改name和nikename
public void upDate(Node node){
Node temp=head.next;//创建辅助节点
if (temp==null){//判断是否为空链表
System.out.println("linkedlist is empety");
return;
}
//遍历链表
boolean flag=false;//创建标记 默认为false,找到true
while (true){
if (temp==null){
break;
}
if (temp.no==node.no){
flag=true;
break;
}
temp=temp.next;
}
if (true){
temp.name=node.name;
temp.nikeName=node.nikeName;
}else {
System.out.println("链表中没有这个no");
}
}
6.删除方法
删方法的思路:我们找到被删除节点的前一个节点,让这个节点的next直接直接跳过被删除节点,直接指向下一个
//根据no删除链表中的节点
public void delete(int no){
Node temp=head;
if (head.next==null){
System.out.println("链表为空");
return;
}
//遍历链表 找到要删除节点的前一个节点
boolean flag=false;//设置标记
while (true){
if (temp.next.no==no){
flag=true;
break;
}
if (temp.next==null){
break;
}
temp=temp.next;
}
if (flag){
temp.next=temp.next.next;//让被删除节点的前一个节点的next跳过被删除节点,直接指向下一个
}else {
System.out.println("链表中没有这个节点");
}
}
7.根据排名添加 ,不能有重复addByNo()
这里按照顺序添加 需要先找到加入位置的前一个节点,让新节点的next为temp.next再让temp.next=node;
//根据排名增加,不可重复添加
public void addByNo(Node node){
Node temp=head;//定义辅助节点
//遍历链表 找到node的前一个节点 把新节点加到其前面
boolean flag=false;//创建标记
while (true){
if (temp.next==null){
break;
}
if (temp.next.no>node.no){
//此处说明找到了 被加位置的前一个节点
break;
}
if (temp.next.no==node.no){
//说明节点已经存在不能重复加
flag=true;
break;
}
temp=temp.next;
}
if (flag){
System.out.println("绿林好汉编号已经存在");
}else {
node.next=temp.next;
temp.next=node;
}
}