单链表的描述和实现(java语言)

链表中每一个结点包含两部分,一部分存放数据,另一部分存放逻辑上相邻的结点的指针。

说明:1.单链表是通过指向后继结点的指针把它的一串结点连接成一个链。

           2.一个单链表是由它的头指针Head来唯一标识。

           3.有时为了操作方便加,在第一个节点之前虚加一个“头结点”。头结点的数据域不存放数值,指针域存放指向第一个结点的指针。

↑头指针head指向头结点。

明白单链表的存储结构之后,我们则开始对他进行一系列的操作。

如何对单链表进行操作?我总结了四个步骤------

1.要先创建一个结点类Node,每一个结点对象表示一个数据元素。

2.在创建一个接口IList,里面来定义你要对表进行的操作。

3.创建一个链表类LinkList,来具体实现你对表的操作。

4.创建一个试验类,来测试你写的操作是否符合要求。

步骤一:创建一个结点类Node

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

步骤二:创建一个接口IList

public interface IList {
    public void clear();
    public boolean isEmpty();
    public int length();
    public Object get(int i) throws Exception;
    public void insert(int i,Object x) throws Exception;
    public void remove(int i) throws Exception;
    public int indexOf(Object x);
    public void display();
}

 步骤三:创建一个链表LinkList

import java.util.Scanner;

public class LinkList implements IList {
    //单链表只需要一个头指针就能唯一表示它,所以但链表类的成员变量只需要设置一个头指针即可
    public Node head;//单链表的头指针

    public LinkList() {
       head = new Node();//初始化头结点
    }
    public LinkList(int n,boolean Order) throws Exception{
        this();
        if(Order)
            create1(n);
        else create2(n);
    }
    private void create1(int n)throws Exception {
        Scanner sc = new Scanner(System.in);
        for(int j=0;j<n;j++){
            insert(length(),sc.next());
        }
    }

    private void create2(int n)throws Exception {
        Scanner sc = new Scanner(System.in);
        for(int j=0;j<n;j++)
            insert(0,sc.next());
    }

    @Override
    public void clear() {
        head.data = null;
        head.next = null;
    }

    @Override
    public boolean isEmpty() {
        return head.next==null;
    }

    @Override
    public int length() {
        Node p = head.next;
        int length = 0;
        while(p!=null){
            p = p.next;
            ++length;
        }
        return length;
    }

    @Override
    public Object get(int i) throws Exception {
        Node p = head.next;
        int j =0;
        while(p !=null && j<i){
            p = p.next;
            ++j;
        }
        if(j>i || p==null){
            throw new Exception("第"+i+"个元素不存在");
        }
        return p.data;
    }

    @Override
    //带头结点的插入数据
    public void insert(int i, Object x) throws Exception {
        Node p = head;
        int j = -1;
        while(p != null && j<i-1){
            p = p.next;
            ++j;
        }
        if(j>i-1 || p==null)
            throw new Exception("插入位置不合法");
        Node s = new Node(x);
        s.next = p.next;
        p.next = s;

    }

    @Override
    public void remove(int i) throws Exception {
        Node p =head;
        int j =-1;
        while(p.next!=null && j<i-1){
            p =p.next;
            ++j;
        }
        if(j>i-1 || p.next == null)
        {
            throw new Exception("删除位置不合法");

        }
        p.next = p.next.next;

    }

    @Override
    public int indexOf(Object x) {
        Node p = head.next;
        int j = 0;
        while(p!=null && !p.data.equals(x)){
            p = p.next;
            ++j;
        }
        if(p!=null)
            return j;
        else return -1;
    }

    @Override
    public void display() {
        Node node = head.next;//取出首结点
        while(node != null){
            System.out.println(node.data+"");
            node = node.next;
        }
        System.out.println();
    }
}

步骤四:创建一个测试类

public class Test {
    public static void main(String[] args) throws Exception {
        int n = 5;
        LinkList linkList = new LinkList();
        for(int i = 0;i<n;i++)
            linkList.insert(i,i);
        linkList.display();
    }
}

上面是我的代码逻辑,有需要代码的请私信我【2】即可获得哟~

加油所有人。。。。。。。 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值