1. 程式人生 > 其它 >資料結構之單向連結串列(增刪改)

資料結構之單向連結串列(增刪改)

技術標籤:資料結構連結串列java演算法單鏈表

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; } } }