java实现数据结构链表中的简单操作

大家学习数据结构时候使用的语言大多数都是c语言版本,那么java是如何操作数据结构中的链表的呢?其实思路与C语言指针操作链表大差不差,只不过java中没有指针,而是使用类的引用实现相关操作。

目录

一、创建节点类型

二、在链表中插入新节点

三、删除元素为p的链表节点

四、删除节点p

五、删除元素p及其后边的所有节点

六、将单链表构建成循环单链表

 


一、创建节点类型

创建链表的第一步当然是要首先定义好节点的单链表的类型啦

C语言中使用结构体指针变量作为单链表的类型,那么我们java中应该如何表示一个节点呢?

没错,就是使用一个类来作为节点对象

public class Node {
    private int data;     //节点存储的数据
    private  Node next;        //存储下一个节点的引用
    public Node(int data)     //带参构造
    {
        this.data=data;
    }

    public void setData(int data) {
        this.data = data;
    }

    public Node getNext() {
        return next;
    }

    public void setNext(Node next) {
        this.next = next;
    }

    public Node(Node next)
    {
        this.next=next;

    }
    public Node(){}         //无参构造
    public int getData(){
        return this.data;
    }

}

这里我们定义了一个java类来作为单链表节点,可以看到,该节点用于存放int类型数据,并通过Node类型变量next来指向下一个节点

二、在链表中插入新节点

    public static void insertNode(Node nodeList,int p,int data)  //在数据为p的节点前面插入        
                                                                  //数据为data的新节点

    {
        Node insetNode = new Node (data);      //将数据封装成节点
        //倘若直接使用头结点,则操作完成后,头结点的指向已经改变,这不合理
        Node  node=nodeList;

        while(node!=null)
        {
            int a=node.getNext().getData();
            if(a==p)   //寻找数据为p的前驱节点
            {
                insetNode.setNext(node.getNext());
                node.setNext(insetNode);
                break;
            }else{
                System.out.println("数据:"+node.getData());
                node=node.getNext();
            }
        }

    }

三、删除元素为p的链表节点

    public static void deleteNode(Node nodeList,int p)  //删除数据为p的节点
    {
        Node node=nodeList;
        while(node.getNext()!=null)
        {
            if(node.getNext().getData()==p) //找到前驱节点
            {
                node.setNext(node.getNext().getNext());
                break;

            }
            node=node.getNext();
        }


    }

四、删除节点p

    public static void deleteNodeByid(Node nodeList,Node p)
    {
        Node node = nodeList;
        while(node!=null&&node.getNext()!=p)
        {
            node=node.getNext();
        }
        if(node==null) System.out.println("你给的节点查询不到");
        else{
            node.setNext(node.getNext().getNext());


        }
    }
    public static Node createNode(Node nodeList,int data)  //返回链表中数据为data的第一个节 
                                                            //点
    {
        Node node = nodeList;
        while(node!=null&&node.getData()!=data)
            node = node.getNext();
        if(node==null) return null;
       else return node;
    }

五、删除元素p及其后边的所有节点

    public static void deleteNumNode(Node nodeList,int p)
    {
        Node node=nodeList;
        while(node.getNext()!=null&&node.getData()!=p)
        {
            node=node.getNext();
        }if(node.getNext()==null) System.out.println("请输入正确的数据");
        while(node!=null)
        {
            deleteNodeByid(nodeList,node);
            node=node.getNext();
        }


    }

    public static void deleteNodeByid(Node nodeList,Node p)
    {
        Node node = nodeList;
        while(node!=null&&node.getNext()!=p)
        {
            node=node.getNext();
        }
        if(node==null) System.out.println("你给的节点查询不到");
        else{
            node.setNext(node.getNext().getNext());


        }
    }

六、将单链表构建成循环单链表

 

这一个实现很简单,只需要将头结点的引用传递给尾结点的next即可

    public static void CircleNode(Node nodeLsit)        //使单链表连接成循环链表
    {
        Node node=nodeLsit;
        while(node.getNext()!=null)
            node=node.getNext();
        node.setNext(nodeLsit);
    }

猜你喜欢

转载自blog.csdn.net/qq_58233310/article/details/124075997