在Java中如何实现双向链表
答案:3 悬赏:0
解决时间 2021-01-20 15:44
- 提问者网友:流星是天使的眼泪
- 2021-01-20 09:26
在Java中如何实现双向链表
最佳答案
- 二级知识专家网友:行路难
- 2021-01-20 10:48
双向链表:就是有双向指针,即双向的链域。
链结点的结构:
┌────┬────┬────────┐
│ 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();
}
}
链结点的结构:
┌────┬────┬────────┐
│ data │next │ previous│
└────┴────┴────────┘
双向链表不必是双端链表(持有对最后一个链结点的引用),双端链表插入时是双向的。
有两条链:一条从头到尾,一条从尾到头,删除遍历时也是双向的。
public class DoublyLinkedList
private Link
private Link
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
if (isEmpty()) {//为空时,第1次插入的新结点为尾结点
rear = newLink;
} else {
head.previous = newLink; //旧头结点的上结点等于新结点
}
newLink.next = head; //新结点的下结点旧头结点
head = newLink; //赋值后,头结点的下结点是旧头结点,上结点null
}
public void insertLast(T data) {//在链尾 插入
Link
if (isEmpty()) {
head = newLink;
} else {
rear.next = newLink;
}
newLink.previous = rear;
rear = newLink; //赋值后,尾结点的上结点是旧尾结点,下结点null
}
public TdeleteHead() {//删除 链头
if (isEmpty()) return null;
Link
head = head.next; //变更首结点,为下一结点
if (head != null) {
head.previous = null;
} else {
rear = null;
}
return temp.data;
}
public TdeleteRear() {//删除 链尾
if (isEmpty()) return null;
Link
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
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
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
while (!current.data.equals(key)) {
current = current.next;
if (current == null) {
return false;
}
}
Link
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
while (current != null) {
current.displayLink();
current = current.next;
}
}
public void displayList4Rear() {//从尾开始遍历
System.out.println("List (last-->first):");
Link
while (current != null) {
current.displayLink();
current = current.previous;
}
}
class Link
T data; //数据域
Link
Link
Link(T data) {
this.data = data;
}
void displayLink() {
System.out.println("the data is " + data.toString());
}
}
public static void main(String[] args) {
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();
}
}
全部回答
- 1楼网友:你可爱的野爹
- 2021-01-20 11:29
自定异常类: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; } } :!:
- 2楼网友:从此江山别
- 2021-01-20 11:00
自定异常类: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; } } :!:
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯