資料結構之單向連結串列(增刪改)
阿新 • • 發佈:2021-01-12
package com.ws.連結串列.單向連結串列.增刪;
//注意:在連結串列遍歷時,要從頭的下一個開始遍歷:Node listNode=head.next;
// 判斷是否到連結串列尾時是判斷當前物件當前節點是否為空,以為添加了節點,要是當前節點下一個的話,就是另一個節點了
// ,而迴圈時已經指向下一個節點了,這是和新增節點遍歷得到連結串列尾時是不同的
public class LinkedList {
public static void main(String[] args) {
//進行測試
//建立節點
Node node1=new Node(1,"王","小王");
Node node2=new Node(2,"李","小李");
Node node3=new Node(3,"周","小周");
Node node4=new Node(4,"馬","小馬");
//建立連結串列
NodeList nodeList= new NodeList();
//加入
nodeList.addNode(node1);
nodeList.addNode(node4);
nodeList.addNode(node2);
nodeList.addNode(node3);
//修改節點
nodeList.list();
Node node=new Node(2,"李","修改李");
nodeList.update(node);
System. out.println("修改後的連結串列");
//顯示
nodeList.list();
//刪除2節點
System.out.println("刪除2節點");
nodeList.delect(2);
System.out.println("刪除後");
nodeList.list();
}
}
//定義Node,每個Node物件就是一個節點
class Node{
public int paixu;
public String name;
public String nickname;
public Node next;//指向下一個節點
//構造器
public Node(int paixu,String name,String nickname){
this.paixu=paixu;
this.name=name;
this.nickname=nickname;
}
@Override
public String toString() {
return "Node{" +
"paixu=" + paixu +
", name='" + name + '\'' +
", nickname='" + nickname + '\'' +
'}';
}
}
//建立NodeList管理Node 就是管理節點,構建連結串列
//單項鍊表
class NodeList{
//初始化一個頭節點,頭結點不動
private Node head=new Node(0,"","");
//新增節點到單向連結串列
//當不考慮編號順序時
//1.找到當前連結串列的最後節點
//2.將最後節點的next指向新的節點
public void add(Node node){
//因為頭結點不能動,所以要一個副本
Node listNode=head;
//遍歷連結串列找到最後
while (true){
//當headtu.next=null找到連結串列最後
if (listNode.next==null){
break;
}
//如果沒有找到最後,就將節點後移
listNode=listNode.next;
}
//退出while迴圈時,listNode就指向了連結串列最後
listNode.next=node;//將最後節點新增新連結串列
}
//插入到指定位置
public void addNode(Node node){
//因為頭節點不能動,所以要有一個副本找節點
//找的listNode是在新增位置的前一個節點,否則插不進去,因為要node.next=list.next
Node listNode=head;
boolean flag=false;//標誌,新增的編號是否已經存在,預設false 就是新節點編號是否已經存在
while (true){
if (listNode.next==null){
//說明listNode已經在連結串列最後
break;
}
//由小到大排序,後一個比前一個大就插入後一個的前面
//因為要插入到新增位置的前面
if (listNode.next.paixu>node.paixu){//位置找到
break;
}else if (listNode.next.paixu==node.paixu){
//說明希望新增的序號已經存在
flag=true;//編號已經存在
break;
}
listNode=listNode.next;//後移,遍歷連結串列
}
//判斷編號是否已經存在
if (flag){//找到
System.out.printf("新增編號【%d】已經存在,不能加入\n",listNode.paixu);
}else {
//插入到連結串列中
node.next=listNode.next;
listNode.next=node;
}
}
//修改節點資訊
//根據序號修改,序號不能更改
public void update(Node node){
//判斷連結串列是否為空
if (head.next==null){
System.out.println("連結串列為空");
return;
}
//根據序號找到需要修改的節點
//一個頭節點的副本
Node listNode=head;
boolean flag=false;//表示是否找到該節點
while (true){
if (listNode==null){
//到連結串列的尾,啥也沒找到
break;
}
if (listNode.paixu==node.paixu){
//已經找到節點
flag=true;
break;
}
listNode=listNode.next;
}
//判斷是否找到要修改的節點
if (flag){//找到
listNode.name=node.name;
listNode.nickname=node.nickname;
}else {
//沒有找到節點
System.out.printf("沒有找到編號【%d】的節點,不能修改\n",node.paixu);
}
}
//刪除節點
//找到要刪除的節點的前一個節點
//因為要listNode.next=listNode.next.next
//被刪除的節點將被垃圾回收機制刪除
public void delect(int paixu){
//頭不能動,要有一個副本
Node listNode=head;
boolean flag=false;//是否找到待刪除的前一個節點
while (true){
if (listNode.next==null){
//已經到連結串列尾,啥也沒找打
break;
}
if (listNode.next.paixu==paixu){
//找到待刪除節點前一個
flag=true;
break;
}
listNode=listNode.next;
}
//判斷是否找到待刪除節點
if (flag){
//可以刪除
listNode.next=listNode.next.next;
}else {
System.out.printf("要刪除的【%d】節點不存在\n",paixu);
}
}
//遍歷單向連結串列
public void list(){
//判斷連結串列是否為空
if (head.next==null){
System.out.println("連結串列為空");
return;
}
//因為頭節點不能動,所以要一個副本來遍歷
Node listNode=head.next;
while (true){
//判斷是否到連結串列最後
if (listNode==null){
break;
}
//連結串列不為空,輸出節點資訊
System.out.println(listNode);
//將節點後移listNode
listNode=listNode.next;
}
}
}