单链表简单的实现(包括链表的增删查改)
package com.it.likedList;
import java.nio.charset.CharsetEncoder;
/**
* @author Snail-Bo
* @date 2020/3/27 13:48
*/
class SingleLinkedListDemo {
public static void main(String[] args) {
//测试
UserNode user1 = new UserNode(1, "小王", "1233");
UserNode user2 = new UserNode(2, "赵六", "2222");
UserNode user3 = new UserNode(3, "王五", "333");
SingleLinkedList sing = new SingleLinkedList();
/*System.out.println("不顺序插入");
sing.add(user2);
sing.add(user1);
sing.add(user3);
sing.list();*/
System.out.println(" 根据id顺序的插入");
sing.addByid(user2);
sing.addByid(user1);
sing.addByid(user3);
sing.list();
System.out.println("进行删除操作");
//sing.delete(3);
sing.delete(1);
//sing.delete(2);
sing.list();
System.out.println("进行修改操作");
UserNode user4 = new UserNode(3, "刘大头", "4333");
sing.updateNode(user4);
sing.list();
}
}
class SingleLinkedList{
//初始化一个头节点 ,一般是定义不变的,不放具体的数据
private UserNode head = new UserNode(0,"","0");
//添加用户节点
public void add(UserNode userNode){
//头节点不能动,使用辅助的节点进行扫描,遍历
UserNode temp = head;
//遍历链表,找到最后面的那个节点,来进行添加节点
while (temp.next!=null){
temp = temp.next; //temp进行后移
}
temp.next=userNode; //将要新添加的节点,添加到最后的节点上
}
//根据id的顺序进行节点的添加
public void addByid(UserNode userNode){
UserNode temp = head;
boolean flag = false; //判断是否找有相同的节点
while (true){
if(temp.next==null){ //说明该temp就在链表的最后
break;
}
if(temp.next.getId()>userNode.getId()){
break; //找到了插入的节点位置
}
if(temp.next.getId()==userNode.getId()){
flag=true ;//编号已存在
break;
}
temp = temp.next;
}
if (flag){
System.out.println("编号已存在,不能添加");
}else {
//将需要插入的节点添加到链表中
userNode.next=temp.next; //先将temp后面的那个节点和插入节点连接起来
temp.next=userNode; //再将temp和新插入的节点连接
}
}
/**
* 根据id来进行修改节点
* @param userNode
*/
public void updateNode(UserNode userNode){
UserNode temp = head;
boolean flag = false;
while (true){
if(temp.getId()==userNode.getId()){
flag=true; //表示找到了要修改的id 的节点
break;
}
temp=temp.next;
}
if (flag){
temp.setName(userNode.getName()); //进行赋值
temp.setNum(userNode.getNum());
}else {
System.out.println("没有找到该节点");
}
}
/**
* 根据id删除节点
* @param id
*/
public void delete(int id){
UserNode temp = head; //使用辅助节点进行扫描
boolean flag = false; //判断是否找到要删除的节点的id
while(true){
if(temp.next==null){
break;
}
if(temp.next.getId()==id){ //通过temp节点的next找到要删除节点,(即为temp后面的那个节点就为要删除的节点)
flag = true;
break;
}
temp = temp.next; //进行后移,遍历
}
if (true){
temp.next=temp.next.next; //将temp后面的节点直接跳过后一个节点 ,连接到 后面的后面的节点,即可实现删除找到的该节点
}else {
System.out.println("没有找到这个节点");
}
}
//显示所有的链表(遍历)
public void list(){
//首先进行判断链表是否为空
if (head.next==null){
System.out.println("链表为空");
return;
}
UserNode temp = head.next;
//遍历head后面的节点 ,进行打印输出
while (temp!=null){
System.out.println(temp);
temp = temp.next; //将temp 进行后移
}
}
}
//定义用户的对象 即为每一个节点
class UserNode{
private int id; //用户的编号
private String name; //用户的姓名
private String num; //用户的号码
UserNode next; // 指向下一个用户
//构造器
public UserNode(int id, String name, String num) {
this.id = id;
this.name = name;
this.num = num;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNum() {
return num;
}
public void setNum(String num) {
this.num = num;
}
public UserNode getNext() {
return next;
}
public void setNext(UserNode next) {
this.next = next;
}
@Override
public String toString() {
return "UserNode{" +
"id=" + id +
", name='" + name + '\'' +
", num='" + num + '\'' +
", next=" + next +
'}';
}
}