数据结构 单向链表

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

猜你喜欢

转载自blog.csdn.net/guyjy/article/details/106584322