數據結構 - 單鏈表的創建、插入、修改、刪除和遍歷(Java實現)

單鏈表的插入

在這裏插入圖片描述
  尾插法:使用一個臨時結點直接找到最後一個結點 temptemp,然後 temp.next=newNode,newNode.next=nulltemp.next = newNode, newNode.next = null

在這裏插入圖片描述
  在中間結點插入一個結點:找到要插入結點的位置的前一個位置的結點 temptemp,讓待插入結點的 nextnext 域指向 temptemp 的後面的結點,最後讓 temptempnextnext 域指向待插入結點即可。即 newNode.next=temp.next,temp.next=newNode.nextnewNode.next = temp.next,temp.next = newNode.next
在這裏插入圖片描述

//在鏈表的最後插入一個元素,尾插法
    public void insertList(PersonNode personNode) {
        PersonNode temp = head;
        while(temp.next != null) {//找到最後一個結點
            temp = temp.next;
        }
        temp.next = personNode;
    }
 //按照結點順序插入
    public void insertListByOrder(PersonNode personNode) {
        PersonNode temp = head;
        while(temp.next != null && temp.next.STNumber != personNode.STNumber && temp.next.STNumber < personNode.STNumber) {
            temp = temp.next;
        }
        if(temp.next == null) {
            temp.next = personNode;
        } else if(temp.next.STNumber == personNode.STNumber) {
            System.out.printf("學號 %d 已經存在無法插入\n", personNode.STNumber);
        } else {
            personNode.next = temp.next;
            temp.next = personNode;
        }
    }

單鏈表的修改

  直接找到對應位置的結點,然後修改結點信息爲新的值。

//根據學號修改結點信息
    public void updateList(int STNumber, String name) {
        if(head.next == null) {
            System.out.println("鏈表爲空,無法進行修改!");
            return ;
        }
        PersonNode temp = head.next;
        while(temp != null && temp.STNumber != STNumber) {
            temp = temp.next;
        }
        if(temp == null) {
            System.out.printf("學號 %d 不存在,無法修改!\n", STNumber);
            return ;
        }
        temp.name = name;
    }

單鏈表的刪除

  找到要刪除的結點的前面一個位置的結點 temptemp,直接讓 temp.next=temp.next.nexttemp.next = temp.next.next
在這裏插入圖片描述

 //刪除結點信息
    public void deleteList(int STNumber) {
        if(head.next == null) {
            System.out.println("鏈表爲空,無法進行刪除");
            return ;
        }
        PersonNode temp = head;
        while(temp.next != null && temp.next.STNumber != STNumber) {
            temp = temp.next;
        }
        if(temp.next == null) {
            System.out.printf("學號%d不存在,無法刪除該學生\n", STNumber);
            return ;
        }
        temp.next = temp.next.next;
    }

單鏈表的遍歷

  直接一邊查看 temptemp 是否爲 nullnull,一邊輸出結點信息

//遍歷鏈表
    public void outputList() {
        if(head.next == null) {
            System.out.println("鏈表爲空,請添加結點後進行遍歷!");
            return ;
        }
        PersonNode temp = head.next;
        while(temp != null) {
            System.out.println(temp);
            temp = temp.next;
        }
    }

整體測試代碼

import org.w3c.dom.ls.LSOutput;

public class SingleLinkedListTest1 {
    public static void main(String[] args) {
        PersonNode person1 = new PersonNode(1, "111", "1", 1);
        PersonNode person2 = new PersonNode(2, "222", "2", 2);
        PersonNode person3 = new PersonNode(3, "333", "3", 3);
        SingleLinkedList1 singleLinkedList = new SingleLinkedList1();
        singleLinkedList.outputList();
        singleLinkedList.insertListByOrder(person1);
        singleLinkedList.insertListByOrder(person3);
        singleLinkedList.insertListByOrder(person2);
        singleLinkedList.outputList();
        singleLinkedList.updateList(1, "update1");
        singleLinkedList.updateList(4, "update4");
        singleLinkedList.outputList();
        singleLinkedList.deleteList(1);
        singleLinkedList.deleteList(4);
        singleLinkedList.deleteList(2);
        singleLinkedList.deleteList(3);
        singleLinkedList.deleteList(1);
        singleLinkedList.outputList();
    }
}

class SingleLinkedList1 {
    //初始化頭結點
    private PersonNode head = new PersonNode(0, "", "", 0);
    //在鏈表的最後插入一個元素,尾插法
    public void insertList(PersonNode personNode) {
        PersonNode temp = head;
        while(temp.next != null) {//找到最後一個結點
            temp = temp.next;
        }
        temp.next = personNode;
    }
    //遍歷鏈表
    public void outputList() {
        if(head.next == null) {
            System.out.println("鏈表爲空,請添加結點後進行遍歷!");
            return ;
        }
        PersonNode temp = head.next;
        while(temp != null) {
            System.out.println(temp);
            temp = temp.next;
        }
    }
    //根據學號修改結點信息
    public void updateList(int STNumber, String name) {
        if(head.next == null) {
            System.out.println("鏈表爲空,無法進行修改!");
            return ;
        }
        PersonNode temp = head.next;
        while(temp != null && temp.STNumber != STNumber) {
            temp = temp.next;
        }
        if(temp == null) {
            System.out.printf("學號 %d 不存在,無法修改!\n", STNumber);
            return ;
        }
        temp.name = name;
    }
    //刪除結點信息
    public void deleteList(int STNumber) {
        if(head.next == null) {
            System.out.println("鏈表爲空,無法進行刪除");
            return ;
        }
        PersonNode temp = head;
        while(temp.next != null && temp.next.STNumber != STNumber) {
            temp = temp.next;
        }
        if(temp.next == null) {
            System.out.printf("學號%d不存在,無法刪除該學生\n", STNumber);
            return ;
        }
        temp.next = temp.next.next;
    }
    //按照結點順序插入
    public void insertListByOrder(PersonNode personNode) {
        PersonNode temp = head;
        while(temp.next != null && temp.next.STNumber != personNode.STNumber && temp.next.STNumber < personNode.STNumber) {
            temp = temp.next;
        }
        if(temp.next == null) {
            temp.next = personNode;
        } else if(temp.next.STNumber == personNode.STNumber) {
            System.out.printf("學號 %d 已經存在無法插入\n", personNode.STNumber);
        } else {
            personNode.next = temp.next;
            temp.next = personNode;
        }
    }
}
//鏈表中保存的結點信息
class PersonNode{
    int STNumber;
    String name;
    String gender;
    int age;
    PersonNode next;
    public PersonNode(int STNumber, String name, String gender, int age) {
        this.STNumber = STNumber;
        this.name = name;
        this.gender = gender;
        this.age = age;
    }

    @Override
    public String toString() {
        return "PersonNode{" +
                "STNumber='" + STNumber + '\'' +
                ", name='" + name + '\'' +
                ", gender='" + gender + '\'' +
                ", age=" + age +
                '}';
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章