手写链表(jvav)

最近突然对数据结构的实现感兴趣,闲来无事用Java手写的一个链表系统

推荐自己从头到尾写一遍,还是有些趣味性的,还可以加深对于链表运行过程的理解

import java.util.*;
import java.util.Arrays;

public class Node {
    int x;
    Node next;
    Node(){
        x = 0;
    }
    Node(int x){
        this.x = x;
    }
}
class Linklist{
    Node first;
    int cnt=0;
    Linklist(){
        this.init();
    }
    void Insert(int x,int i){
        if(i<1||i>this.cnt+1){
            System.out.println("插入失败,请检查下标");
            return;
        }
        Node q = new Node(x);
        Node p = this.first;
        for(int j=1;j<i;j++){
            p = p.next;
        }
        q.next = p.next;
        p.next = q;
        this.cnt++;
    }
    void print(){
        if(this.cnt==0){
            System.out.println("Null\n");
            return;
        }
        Node p = this.first.next;
        for(int i=0;i<this.cnt;i++){
            System.out.print(p.x+" ");
            p = p.next;
        }
        System.out.println();
    }
    void init(){
        this.first = new Node();
        this.first.next = null;
    }
    void changeX(int x,int i){
        if(i<1||i>this.cnt){
            System.out.println("修改失败,请检查下标是否正确");
            return;
        }
        Node p = this.first;
        for(int j = 0;j<i;j++)p=p.next;
        p.x = x;
    }
    void delete(int i){
        if(i<1||i>this.cnt){
            System.out.println("删除失败,请检查下标是否正确");
            return;
        }
        Node q;
        Node p = this.first;
        for(int j=1;j<i;j++){
            p=p.next;
        }
        q= p.next;
        p.next = q.next;
        this.cnt--;
    }
    void find(int x){
        Node p = this.first;
        for(int j = 1;j<=this.cnt;j++){
            p=p.next;
            if(p.x==x){
                System.out.printf("链表中 %d 为第 %d个元素\n",x,j);
            }
        }
        System.out.printf("未找到 :%d\n",x);
    }
    void sort(){
        int[] a = new int[this.cnt+10];
        Node p = this.first;
        for (int i = 0; i<this.cnt; i++){
            p = p.next;
            a[i] = p.x;
        }
        Arrays.sort(a,0,this.cnt);
        p = this.first;
        for (int i = 0; i<this.cnt; i++){
            p = p.next;
            p.x = a[i];
        }
    }
}

class test1{

    public static void main(String[] args) {

        Linklist list = new Linklist();
        test1Job(list);

    }
    static void menu(){
        System.out.println("---------------------------");
        System.out.println("1. 插 入 元 素");
        System.out.println("2. 删 除 元 素");
        System.out.println("3. 修 改 元 素");
        System.out.println("4. 寻 找 元 素");
        System.out.println("5. 链 表 排 序");
        System.out.println("6. 输 出 链 表");
        System.out.println("7. 退 出 系 统");
        System.out.println("---------------------------");
    }
    static void Insert(Linklist list){
        Scanner in = new Scanner(System.in);
        System.out.println("输入插入节点数:");
        int n= in.nextInt();
        System.out.printf("输入 %d 个整数:",n);
        for(int i=0;i<n;i++){
            list.Insert(in.nextInt(),list.cnt+1);
        }
    }
    static void test1Job(Linklist list){
        Scanner in = new Scanner(System.in);
        int input= 1;
        while(input!=7){
            menu();
            System.out.println("输入选项[1~7]:");
            input = in.nextInt();
            if(input<1||input>7)
            {
                System.out.println("麻烦您输入正确选项,谢了");
                continue;
            }
            switch (input){
                case 1:
                    Insert(list);
                    break;
                case 2:
                    int x;
                    System.out.println("输入你要删除的数字下标(下标从1开始)");
                    do{
                        x = in.nextInt();
                        if(x<1||x>list.cnt)
                            System.out.printf("请输入正确下标,目前链表长度为 %d,你输入的范围是[%d~%d]",list.cnt,1,list.cnt);
                    }while(x<1||x>list.cnt);
                    list.delete(x);
                    break;
                case 3:
                    int y;
                    System.out.println("输入你要修改的数字下标(下标从1开始)");
                    do{
                        y = in.nextInt();
                        if(y<1||y>list.cnt)
                            System.out.printf("请输入正确下标,目前链表长度为 %d,你输入的范围是[%d~%d]",list.cnt,1,list.cnt);
                    }while(y<1||y>list.cnt);
                    System.out.println("输入你要修改的值");
                    int ch = in.nextInt();
                    list.changeX(ch,y);
                    break;
                case 4:
                    System.out.println("请输入你要寻找的值");
                    int fi = in.nextInt();
                    list.find(fi);
                    break;
                case 5:
                    list.sort();
                    System.out.println("排序完成啦");
                    break;
                case 6:
                    System.out.print("链表输出:");
                    list.print();
                    break;
                case 7:
                    System.out.println("退出成功啦");
                    break;
            }
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值