中易网

在Java中如何实现双向链表

答案:3  悬赏:0  
解决时间 2021-01-20 15:44
在Java中如何实现双向链表
最佳答案
双向链表:就是有双向指针,即双向的链域。
链结点的结构:
┌────┬────┬────────┐
│ data │next │ previous│
└────┴────┴────────┘
双向链表不必是双端链表(持有对最后一个链结点的引用),双端链表插入时是双向的。
有两条链:一条从头到尾,一条从尾到头,删除遍历时也是双向的。

public class DoublyLinkedList {
private Link head; //首结点
private Link rear; //尾部指针
public DoublyLinkedList() {}
public T peekHead() {
if (head != null) {
return head.data;
}
return null;
}
public boolean isEmpty() {
return head == null;
}
public void insertFirst(T data) {// 插入 到 链头
Link newLink = new Link(data);
if (isEmpty()) {//为空时,第1次插入的新结点为尾结点
rear = newLink;
} else {
head.previous = newLink; //旧头结点的上结点等于新结点
}
newLink.next = head; //新结点的下结点旧头结点
head = newLink; //赋值后,头结点的下结点是旧头结点,上结点null
}
public void insertLast(T data) {//在链尾 插入
Link newLink = new Link(data);
if (isEmpty()) {
head = newLink;
} else {
rear.next = newLink;
}
newLink.previous = rear;
rear = newLink; //赋值后,尾结点的上结点是旧尾结点,下结点null
}
public TdeleteHead() {//删除 链头
if (isEmpty()) return null;
Link temp = head;
head = head.next; //变更首结点,为下一结点
if (head != null) {
head.previous = null;
} else {
rear = null;
}
return temp.data;
}
public TdeleteRear() {//删除 链尾
if (isEmpty()) return null;
Link temp = rear;
rear = rear.previous; //变更尾结点,为上一结点
if (rear != null) {
rear.next = null;
} else {
head = null;
}
return temp.data;
}
public T find(T t) {//从头到尾find
if (isEmpty()) {
return null;
}
Link find = head;
while (find != null) {
if (!find.data.equals(t)) {
find = find.next;
} else {
break;
}
}
if (find == null) {
return null;
}
return find.data;
}
public T delete(T t) {
if (isEmpty()) {
return null;
}
Link current = head;
while (!current.data.equals(t)) {
current = current.next;
if (current == null) {
return null;
}
}
if (current == head) {
head = head.next;
if (head != null) {
head.previous = null;
}
} else if (current == rear) {
rear = rear.previous;
if (rear != null) {
rear.next = null;
}
} else {
//中间的非两端的结点,要移除current
current.next.previous = current.previous;
current.previous.next = current.next;
}
return current.data;
}
public boolean insertAfter(T key, T data) {//插入在key之后, key不存在return false
if (isEmpty()) {
return false;
}
Link current = head;
while (!current.data.equals(key)) {
current = current.next;
if (current == null) {
return false;
}
}
Link newLink = new Link(data);
if (current == rear) {
rear = newLink;
} else {
newLink.next = current.next;
current.next.previous = newLink;
}
current.next = newLink;
newLink.previous = current;
return true;
}
public void displayList4Head() {//从头开始遍历
System.out.println("List (first-->last):");
Link current = head;
while (current != null) {
current.displayLink();
current = current.next;
}
}
public void displayList4Rear() {//从尾开始遍历
System.out.println("List (last-->first):");
Link current = rear;
while (current != null) {
current.displayLink();
current = current.previous;
}
}

class Link {//链结点
T data; //数据域
Link next; //后继指针,结点 链域
Link previous; //前驱指针,结点 链域
Link(T data) {
this.data = data;
}
void displayLink() {
System.out.println("the data is " + data.toString());
}
}
public static void main(String[] args) {
DoublyLinkedList list = new DoublyLinkedList();
list.insertLast(1);
list.insertFirst(2);
list.insertLast(3);
list.insertFirst(4);
list.insertLast(5);
list.displayList4Head();
Integer deleteHead = list.deleteHead();
System.out.println("deleteHead:" + deleteHead);
list.displayList4Head();
Integer deleteRear = list.deleteRear();
System.out.println("deleteRear:" + deleteRear);
list.displayList4Rear();
System.out.println("find:" + list.find(6));
System.out.println("find:" + list.find(3));
System.out.println("delete find:" + list.delete(6));
System.out.println("delete find:" + list.delete(1));
list.displayList4Head();
System.out.println("----在指定key后插入----");
list.insertAfter(2, 8);
list.insertAfter(2, 9);
list.insertAfter(9, 10);
list.displayList4Head();
}
}
全部回答
自定异常类: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(){ } public boolean hasNext(Node node){ if(node.next==null) return false; return true; } public boolean hasPrev(Node node){ if(node.previou==null) return false; return true; } public Node getHead() throws MyException{ if(head==null){ throw new MyException("链表为空"); } return head; } public Node getPrev(Node node){ return node.previou; } public Node getNext(Node node){ return node.next; } 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; } 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; } public void addHead(Node node){ if(head==null){ head=node; }else{ node.next=head; head.previou=node; head=node; } } public void addLast(Node node) throws MyException{ if(head==null){ head=node; }else{ Node last=this.getLast(); last.next=node; node.previou=last; } } 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; } public Node deleteHead() throws MyException{ Node head=this.getHead(); if(hasNext(head)){ Node next=head.next; this.head=next; next.previou=null; } return head; } 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; } 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; } } :!:
自定异常类: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(){ } public boolean hasNext(Node node){ if(node.next==null) return false; return true; } public boolean hasPrev(Node node){ if(node.previou==null) return false; return true; } public Node getHead() throws MyException{ if(head==null){ throw new MyException("链表为空"); } return head; } public Node getPrev(Node node){ return node.previou; } public Node getNext(Node node){ return node.next; } 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; } 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; } public void addHead(Node node){ if(head==null){ head=node; }else{ node.next=head; head.previou=node; head=node; } } public void addLast(Node node) throws MyException{ if(head==null){ head=node; }else{ Node last=this.getLast(); last.next=node; node.previou=last; } } 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; } public Node deleteHead() throws MyException{ Node head=this.getHead(); if(hasNext(head)){ Node next=head.next; this.head=next; next.previou=null; } return head; } 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; } 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; } } :!:
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
如何应对全球化的人才竞争
多乐士金装五合一净味多少钱一桶?哪些地方可
马丁公司专门为以色列空军定做首架f 16i型
卫兰和卫龙是什么关系
PS中自由变换图层时为什么不能改变中心点的位
怎么样领取红包啊?
汉中防静电地板专卖店产品价格如何
QQ飞车里现在哪个B车好?
面部擦伤关于色素沉着
我有萤石矿,需要投资人
征途2多少个宝石可以砸一个11星套
房屋租赁合同最少能签多少年
如何利用阻容降压使用大电流?
初生婴儿脸部有个鲜红斑记
什么是湿痹症
推荐资讯
刚果河在刚果还是在刚果民主共和国
两个月的宝宝一星期不大便正常吗
火车t31空调冷吗
新车里有没有甲醛?如果有怎么去除?
询问别人职业的有关句型
升级IOS9为什么有人说卡有人说很流畅,怎么差
孩子换牙改注意什么
请问如何辨别工商号真伪
经常喝铁观音茶对尿酸高的人有何影响?
歌词 你在哪里我在你那里你我不放弃
这根馈线如何接?
浴巾置物架哪种材质好?有谁晓得?有人了解吗
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?