发布网友 发布时间:2022-04-21 17:35
共3个回答
懂视网 时间:2022-04-15 12:22
链表是一种重要的数据结构,在程序设计中占有很重要的地位。C语言和C++语言中是用指针来实现链表结构的,由于Java语言不提供指针,所以有人认为在Java语言中不能实现链表,其实不然,Java语言比C和C++更容易实现链表结构。Java语言中的对象引用实际上是一个指针(本文中的指针均为概念上的意义,而非语言提供的数据类型),所以我们可以编写这样的类来实现链表中的结点。
class Node
{
Object data;
Node next;//指向下一个结点
}
将数据域定义成Object类是因为Object类是广义超类,任何类对象都可以给其赋值,增加了代码的通用性。为了使链表可以被访问还需要定义一个表头,表头必须包含指向第一个结点的指针和指向当前结点的指针。为了便于在链表尾部增加结点,还可以增加一指向链表尾部的指针,另外还可以用一个域来表示链表的大小,当调用者想得到链表的大小时,不必遍历整个链表。下图是这种链表的示意图:
热心网友 时间:2022-04-15 09:30
双向链表:就是有双向指针,即双向的链域。热心网友 时间:2022-04-15 10:48
自定异常类:Java代码 public class MyException extends Exception { public MyException(){}; public MyException(String msg){ super(msg); } } 链表结点对像:Java代码 public class Node { public Node previou=null;//前结点指针 public Node next=null; //后结点指针 public Object value;//结点值 Node(Object value){ this.value=value; } } 链表对像: Java代码 public class DoubleLinked { private Node head;//链表头 DoubleLinked(){ } /** * 判断是否还有下一个结点,没有则为链表的尾结点 * @param node * @return */ public boolean hasNext(Node node){ if(node.next==null) return false; return true; } /** * 判断是否有上一个结点,没有则为链表的头结点 * @param node * @return */ public boolean hasPrev(Node node){ if(node.previou==null) return false; return true; } /** * 获取链表头元素 * @return * @throws MyException */ public Node getHead() throws MyException{ if(head==null){ throw new MyException("链表为空"); } return head; } /** * 获取上一个接点 * @param node * @return */ public Node getPrev(Node node){ return node.previou; } /** * 获取下一个结点 * @param node * @return */ public Node getNext(Node node){ return node.next; } /** * 根据索引获取结点 * @param index:结点索引 * @return * @throws MyException */ public Node getNode(int index) throws MyException{ Node curNode=null; Node next=null; Node node=null; if(head==null){ throw new MyException("链表为空"); }else{ curNode=head; for(int i=0;i<index;i++){ if(curNode==null){ throw new MyException("你要获取的元素索引大于链表长度"); }else{ node=curNode; if(hasNext(curNode)){ next=curNode.next; curNode=next; }else{ curNode=null; } } } } return node; }/** * 获取最后一个结点 * @return * @throws MyException */ public Node getLast() throws MyException{ Node curNode=null; Node next=null; Node last=null; boolean flag=true; if(head==null){ throw new MyException("链表为空"); }else{ curNode=head; while(flag){ if(hasNext(curNode)){ next=curNode.next; curNode=next; }else{ last=curNode; flag=false; } } } return last; } /** * 在链表头添加新结点 * @param node */ public void addHead(Node node){ if(head==null){ head=node; }else{ node.next=head; head.previou=node; head=node; } } /** * 在链表末尾处添加新结点 * @param node * @throws MyException */ public void addLast(Node node) throws MyException{ if(head==null){ head=node; }else{ Node last=this.getLast(); last.next=node; node.previou=last; } } /** * 在链表中间插入新结点 * @param node * @throws MyException */ public void insertNode(int index,Node node) throws MyException{ Node indexNode=this.getNode(index); Node prev=indexNode.previou; prev.next=node; node.previou=prev; node.next=indexNode; indexNode.previou=node; } /** * 删除链表头结点 * @return * @throws MyException */ public Node deleteHead() throws MyException{ Node head=this.getHead(); if(hasNext(head)){ Node next=head.next; this.head=next; next.previou=null; } return head; } /** * 删除链表的最后一个结点 * @return * @throws MyException */ public Node deleteLast() throws MyException{ Node last=this.getLast(); Node prev=last.previou; if(prev==null){ this.head=null; }else{ prev.next=null; } return last; } /** * 根据索引删除链表结点 * @param index * @return * @throws MyException */ public Node deleteNode(int index) throws MyException{ Node node=this.getNode(index); Node prev=node.previou; Node next=node.next; if(prev==null && next!=null){ this.head=next; next.previou=null; } if(prev!=null && next==null){ prev.next=null; } if(prev==null && next==null){ this.head=null; } if(prev!=null && next!=null){ prev.next=next; next.previou=prev; } return node; } } :!: