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 + '\'' + '}'; } }