Java数据结构单向链表(1)

题目:已知链表类的定义如下,实现各个成员函数。主函数中输入数据(以0结束)利用Insert函数依次将数据插入到表的1号位置,利用DispList按照逻辑次序输出表中元素,再输入一个要查找的元素,利用查找函数Locate查找其在表中的位置,最后利用Reverse函数将数据逆序,再利用DispList输出。

import java.util.Scanner;

//定义链表的结点类
class Node {
    public Object data; //保存数据的变量
    public Node next; //保存下一个结点的地址

    //默认构造函数,初始化时不包含数据和下一个结点的地址
    public Node() {
        this(null,null);
    }

    //带有数据的构造函数,初始化时包含数据,但是没有下一个结点的地址
    public Node(Object data) {
        this(data,null);
    }

    //带有数据和下一个结点地址的构造函数
    public Node(Object data, Node next) {
        this.data = data;
        this.next = next;
    }
}

// 定义链表的操作类
class LinkList {
    private Node node; //链表头结点
    private int currth = 0; // 链表长度

    //默认构造函数
    public LinkList() {
        node = new Node();
    }

    //向链表的指定位置插入数据x
    public void insert(int i,Object x) throws Exception{
        Node p = node;
        int j = 0;
        while(p!=null&&j<i-1) {
            p = p.next;
            j++;
        }
        if(p==null||j>i+1) { //如果i不合法则插入失败并抛出异常
            throw new Exception("Illegal insertion position");
        }
        Node s = new Node(x); // 构造新的结点s
        s.next = p.next;
        p.next = s;
        currth++; //链表长度加一
    }

    //查找元素obj在链表中的位置,如果找不到返回-1
    public int get(Object obj) {
        int i = 1;
        Node p = node.next; //从链表地一个结点开始查找
        while(p!=null&&!p.data.equals(obj)) {
            p = p.next;
            i++;
        }
        if(p!=null) {
            return i;
        }else
            return -1;
    }

    //获取链表长度
    public int length() {
        return currth;
    }

    //打印链表所有的元素
    public void display() {
        Node dis = node.next;
        while(dis!=null) { // 遍历链表并输出元素
            System.out.print(dis.data+" ");
            dis = dis.next;
        }
        System.out.println();
    }

    //反转链表
    public void reverse() {
        Node head = node,p = node.next,q = null;
        head.next = null; //将原头节点去掉

        while(p!=null) {
            q = p.next; //保存下一个结点
            p.next = head.next; 
            head.next = p; //插入新的头结点
            p = q;
        }
    }
}

//主程序
public class Main {
    public static void main(String[] args) throws Exception {
        LinkList lis = new LinkList(); //创建一个新的链表
        Scanner sc = new Scanner(System.in); //创建新的Scanner对象
        int next = sc.nextInt(); //输入第一个元素
        while(next!=0) { //输入元素直到为0
            lis.insert(1, next); //向链表的头结点后插入新的元素
            next = sc.nextInt();
        }

        //输出链表长度和元素
        int length = lis.length();
        System.out.println("The length:"+length);
        System.out.println("The elements:");
        lis.display();

        //查找指定元素的位置
        next = sc.nextInt();
        if(lis.get(next)!=-1) {
            System.out.println("Found position:"+lis.get(next));
        }else {
            System.out.println("No found");
        }

        //反转链表并输出
        System.out.println("The length:"+length);
        lis.reverse();
        System.out.println("The elements:");
        lis.display(); 
    } 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值