單向鏈表


package com.cxy.springdataredis.data;

import ch.qos.logback.core.net.SyslogOutputStream;
import sun.reflect.generics.reflectiveObjects.LazyReflectiveObjectGenerator;

import java.util.Stack;

public class SingleLinkedListDemo {
    public static void main(String[] args) {
        Node node =new Node(1,"老外","1111");
        Node node1 =new Node(2,"老外1","2222");
        Node node2 =new Node(3,"老外2","3333");
        Node node3 =new Node(3,"老外333","3333");
        Node node4 =new Node(4,"老外3","4444");
        SingleLinkedList linkedList = new SingleLinkedList();
        /*linkedList.add(node);
        linkedList.add(node1);
        linkedList.add(node2);
        linkedList.add(node4);*/
        linkedList.addByOrder(node);
        linkedList.addByOrder(node4);
        linkedList.addByOrder(node2);
        linkedList.addByOrder(node1);
        reverseList(linkedList.getHead());
        linkedList.list();
        System.out.println("----------------");
        linkedList.update(node3);
        linkedList.list();
        System.out.println("----------------");
        linkedList.deleteNode(1);
        linkedList.list();
        System.out.println("----------------");
        linkedList.deleteNode(4);
        linkedList.list();
        System.out.println(getLength(linkedList.getHead()));

        System.out.println(fingLastIndexNode(linkedList.getHead(),2));

    }
    public static void reversePrint(Node head) {
        if(head.next == null) {
            return;//空鏈表,不能打印
        }
        //創建要給一個棧,將各個節點壓入棧
        Stack<Node> stack = new Stack<Node>();
        Node cur = head.next;
        //將鏈表的所有節點壓入棧
        while(cur != null) {
            stack.push(cur);
            cur = cur.next; //cur后移,這樣就可以壓入下一個節點
        }
        //將棧中的節點進行打印,pop 出棧
        while (stack.size() > 0) {
            System.out.println(stack.pop()); //stack的特點是先進后出
        }
    }

    public static void reverseList(Node head){
        if (head.next ==null||head.next.next ==null){
            return ;
        }
        Node temp =head.next;//定義一個輔助的指針,幫助我們來遍歷原來的鏈表
        Node next =null;//
        Node revsrseHead =new Node(0,"","");
        while (temp != null){
            next =temp.next;//保存當前節點的下一個節點
            temp.next =revsrseHead.next;//將temp的下一個節點指向新的鏈表的最前端
            revsrseHead.next =temp;
            temp =next;//讓temp指向下一個
        }
        head.next =revsrseHead.next;
    }
    //獲取鏈表的個數
    public  static int getLength(Node head){
        if (head.next ==null){
            return 0;
        }
        int length =0;
        Node temp =head.next;
        while (temp!=null){
            length++;
            temp =temp.next;
        }
        return length;
    }

    public static Node fingLastIndexNode(Node head,int index){
        Node temp =head.next;
        if (temp ==null){
            return null;
        }
        int length = getLength(head);
        if (index<=0&&index>length){
            return null;
        }
        for (int i =0;i<length -index;i++){
            temp =temp.next;
        }
    return temp;

    }

}
class SingleLinkedList{
    //先初始化頭節點,頭節點不要動 不存放具體數據
    private Node head =new Node(0,"","");

    public Node getHead() {
        return head;
    }


    //添加節點到單項鏈表
    //思路 當不考慮編號順序是
    // 找到當前鏈表的最后節點
    //找到最后這個節點的next指向的新節點
    public  void add(Node node){
        Node temp =head;
        while(true){
            if (temp.next ==null){
                break;
            }
            temp =temp.next;
        }
        temp.next =node;
    }

    public void addByOrder(Node node){
        //頭節點不能動,因此只能通過變量找到添加的位置
        //因為單鏈表,我們必須要找到添加位置的下一個節點,否則插入不了
        Node temp =head;
        boolean flag =false;
        while (true){
            if (temp.next ==null){
                break;
            }
            if (temp.next.num >node.num){
                break;
            }else if(temp.next.num ==node.num){
                flag =true;
                break;
            }
            temp =temp.next;
        }
        if (flag){
            System.out.println("插入的編碼已經存在");
        }else{
            node.next=temp.next;
            temp.next =node;
        }
    }

    public  void  update (Node node){
        Node temp =head.next;
        if (temp ==null){
            System.out.println("鏈表為空");
            return;
        }
        boolean flag =true;
        while (true){
            if (temp == null){
                break;
            }
            if (temp.num ==node.num){
                flag =true;
                break;
            }
            temp =temp.next;
        }
        if (flag){
            temp.nickname =node.nickname;
            temp.name =node.name;
        }
    }

    public  void  deleteNode(int num){
        Node temp =head;
        boolean flag =false;
        while(true){
            if (temp.next ==null){
                System.out.println("當前鏈表為空");
            }
            if (temp.next.num ==num){
                flag =true;
                break;
            }
            temp =temp.next;
        }
        if (flag){
            temp.next =temp.next.next;
        }else {
            System.out.println("刪除的節點不存在");
        }
    }
    //遍歷鏈表
    public  void list(){
        //判斷鏈表是否為空
       if (head.next ==null){
           System.out.println("鏈表為空");
           return;
       }
       //定義零食變量,定義頭節點,輔助遍歷
       Node temp =head.next;
       while(true){
           //判斷鏈表是否為空
           if (temp ==null){
               break;
           }
           //打印鏈表
           System.out.println(temp);
           temp =temp.next;

       }
    }


}

//定義節點
class Node{
    public int num;
    public String name;
    public String nickname;
    public Node next;

    //構造器
    public Node(int num,String name ,String nickname){
        this.num =num;
        this.name =name;
        this.nickname=nickname;
    }

    @Override
    public String toString() {
        return "Node{" +
                "num=" + num +
                ", name='" + name + '\'' +
                ", nickname='" + nickname + '\'' +
                '}';
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM