數據結構 單向鏈表

package com.數據結構;

import java.util.ArrayList;
import java.util.Stack;

public class 單向鏈表 {
    public static void main(String[] args) {
        Node node1 = new Node(1,"宋江","及時雨");
        Node node2 = new Node(5,"林沖","豹子頭");
        Node node3 = new Node(1,"宋江","及時雨");
        Node node4 = new Node(3,"吳用","智多星");
        LinkedOne linkedOne = new LinkedOne() ;
        linkedOne.print();
        linkedOne.sortAdd(node1);
        linkedOne.sortAdd(node2);
        linkedOne.sortAdd(node3);
        linkedOne.sortAdd(node4);
        linkedOne.print();
        linkedOne.del(1);
        linkedOne.del(1);
        Node node5 = new Node(5,"小林","豹子頭頭~~~");
        linkedOne.mod(node5);
        linkedOne.mod(node1);
        linkedOne.seek(5);
        linkedOne.seek(1);
        linkedOne.print();
        System.out.println("--------------------------");
        linkedOne.reverseLinked();
        linkedOne.print();
        System.out.println("--------------------------");
        linkedOne.reverseprintln();
    }
}
class Node{  // 結點
    public int no ;
    public String name;
    public String id ;
    public Node next ;
    public Node() {
    }
    public Node(int no , String name , String id){
        this.id = id ;
        this.name = name ;
        this.no = no;
    }

    @Override
    public String toString() {
        return "Node{" +
                "no=" + no +
                ", name='" + name + '\'' +
                ", id='" + id + '\'' +
                '}';
    }
}
class LinkedOne{  //功能:增 刪 改 查  反轉鏈表
     private Node head = new Node(); //頭結點 不存數據
     public LinkedOne(){
     }
     public void add(Node newNode){  //增加一個節點
         Node temp = head;
         while(temp.next!=null){
             temp= temp.next;
         }
         temp.next = newNode ;
     }
    public void sortAdd(Node newNode){ //增加一個結點按照 no排序
         Node temp = head ;
         boolean flag = false ;
         while(true){ //找到應該插入的位置
             if(temp.next==null){ //直接插到末尾即可
                 flag = true;
                 break;
             }else if(temp.next.no==newNode.no){ //數據已將存在
                 break;
             }else if(temp.next.no>newNode.no){ //找到應該插入的位置
                 flag = true;
                 break;
             }
             temp = temp.next ;
         }
         if(flag){ //數據可插入
             newNode.next = temp.next;
             temp.next = newNode ;
         }else {  //數據不可插入
             System.out.println("數據已經存在了 插入失敗~~~");
         }
    }
    public void del(int no){ //根據no刪除結點
         boolean flag = false ;
         Node temp = head ;
         while(true){
             if(temp.next==null){ //沒找到
                 break ;
             }else if(temp.next.no==no){
                 flag = true ;
                 break ;
             }
             temp = temp.next ;
         }
         if(flag){
             temp.next = temp.next.next;
             System.out.println("刪除成功~~~\n剩餘數據:");
             print();
         }else{
             System.out.println("刪除失敗 數據並不存在~~~");
         }
    }
    public void mod(Node newNode){  //修改no相同的數據
         boolean flag = false ;
         Node temp = head ;
         while(true){
             if(temp.next==null){ //沒找到
                 break;
             }else if(temp.next.no==newNode.no){
                 flag = true ;
                 break ;
             }
             temp = temp .next;
        }
         if(flag){
             newNode.next = temp.next.next ;
             temp.next = newNode;
             System.out.println("修改成功~~~\n修改後的數據:");
             print();
         }else{
             System.out.println("修改失敗 數據並不存在~~~");
         }
    }
    public void seek(int no){ //打印no的信息
         boolean flag = false ;
         Node temp = head ;
         while(true){
             if(temp.next==null){ //沒找到
                 break;
             }else if(temp.next.no==no){
                 flag = true ;
                 break;
             }
             temp = temp.next ;
         }
         if(flag){
             System.out.println(temp.next);
         }else{
             System.out.println("沒找到~~~");
         }
    }
    public void reverseLinked(){  //反轉鏈表
         Node reverseHead = new Node();
         Node reverseTemp = head.next ;
         while(reverseTemp!=null){ //遍歷原鏈表 把遍歷到的每一個節點取出去
             Node reversrTemp1=reverseTemp.next;
             reverseTemp.next=reverseHead.next;
             reverseHead.next=reverseTemp;
             reverseTemp=reversrTemp1;
         }
         head.next = reverseHead.next;
    }
    public void reverseprintln(){  //逆序打印單鏈表
          ArrayList<String> arr = new ArrayList<>();
          Stack<String> stack = new Stack<>();
          Node temp = head.next;
          while(temp!=null){
              arr.add(temp.toString());
              stack.push(temp.toString()); //入棧
              temp = temp.next;
          }
          Object[] str = arr.toArray();
         for(int i=str.length-1;i>=0;i--){
             System.out.println(str[i]);
         }
         while(stack.size()>0){ //出棧
             System.out.println(stack.pop());
         }
    }
    public void print(){
         Node temp = head.next ;
         if(temp == null){
             System.out.println("鏈表爲空,打印失敗~~~");
             return ;
         }
         while(temp!=null){
             System.out.println(temp);
             temp = temp.next ;
         }
    }
}

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