单链表的头没有存储信息,仅作为一个记号;
单链表有一个next指针,指向下一个节点;
可以在除头节点外的任何节点进行增删改查,但是在链表头部操作和在尾部操作所消耗的资源是大不相同的。
package com.base;
class singleLinkedList {
//test
public static void main(String[] args) {
node node1 = new node(1, "zhangsan", "男");
node node2 = new node(2, "lisi", "女");
node node3 = new node(3, "wangwu", "男");
node node4 = new node(3,"zhaoliu","女");
singleLinkedList singleLinkedList = new singleLinkedList();
singleLinkedList.addByOrder(node1);
singleLinkedList.addByOrder(node3);
singleLinkedList.addByOrder(node2);
System.out.println("显示链表:");
singleLinkedList.listAll();
singleLinkedList.updateNode(node4);
System.out.println("更新节点后的链表为:");
singleLinkedList.listAll();
System.out.println("===================");
singleLinkedList.findNodeByName("zhaoliu");
}
// 初始化一个头节点,不存放数据
private node head = new node(0, "", "");
// 添加节点
public void addNode(node node) {
// 需要临时节点
node temp = head;
// 遍历链表,找到链表最后一个节点
while (true) {
// 找到了最后一个
if (temp.next == null)
break;
;
// 如果没找到,则后移temp直至找到最后一个
temp = temp.next;
}
// 当退出while循环时一定找到了最后一个节点,那么将传入的节点放入到最后即可
temp.next = node;
}
public void addByOrder(node node) {
node temp = head;
boolean flag = false;
while (true) {
// 如果temp是最后一个元素,则直接在后面添加即可
if (temp.next == null) {
break;
}
// temp的下一个节点的no值如果大于传入的节点的no,那么就在temp的后面插入
if (temp.next.no > node.no) {
break;
} else 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;
}
}
// 删除节点
public void delNode(node node){
node temp = head;
boolean flag = false;
while (true){
if (temp.next == null){
break;
}
if (temp.next.no == node.no){
flag =true;
break;
}
temp = temp.next;
}
if (flag){
temp.next = temp.next.next;
}else System.out.println("无可删除节点");
}
// 修改节点
public void updateNode(node node){
node temp = head;
boolean flag = false;
while (true){
if (temp.next == null){
break;
}
if (temp.next.no == node.no){
flag =true;
break;
}
temp = temp.next;
}
if (flag){
temp.next.name = node.name;
temp.next.gender = node.gender;
}else addByOrder(node);
}
// 查找节点
public void findNodeByName(String name){
node temp = head;
boolean flag = false;
while (true){
if (temp.next == null){
break;
}
if (temp.next.name == name){
flag =true;
break;
}
temp = temp.next;
}
if (flag){
System.out.println(temp.next);
}else System.out.println("没有找到叫"+name+"的人");;
}
// 显示链表
public void listAll() {
// 如果链表为空则退出
if (head.next == null) {
System.out.println("链表为空~~~");
return;
}
node temp = head.next;
while (true) {
if (temp == null) {
break;
}
System.out.println(temp);
temp = temp.next;
}
}
}
class node {
public int no;
public String name;
public String gender;
public node next;
public node(int no, String name, String gender) {
this.no = no;
this.name = name;
this.gender = gender;
}
@Override
public String toString() {
return "node{" +
"no=" + no +
", name='" + name + '\'' +
", gender='" + gender + '\'' +
'}';
}
}