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 ;
}
}
}
數據結構 單向鏈表
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.