《Java数据结构和算法》双向链表

与单向链表相比,提供了前向遍历的能力。其每个链结点有两个指向其他链结点的引用(next,previous)。

双向链表的各种操作看图比较容易理解。

 

《Java数据结构和算法》双向链表_第1张图片

 

《Java数据结构和算法》双向链表_第2张图片

《Java数据结构和算法》双向链表_第3张图片

 

 

package Structure;


class LinkX{
 public long dData;
 public LinkX next;
 public LinkX previous;
 
 public LinkX(long d){
  dData = d;
 }
 
 public void displayLink(){
  System.out.print(dData+" ");
 }
}//end class Link
class DoublyLinkedList{
 private LinkX first;
 private LinkX last;
 
 public DoublyLinkedList(){
  first = null;
  last = null;
 }
 
 public boolean isEmpty(){
  return first == null;
 }
 
 public void insertFirst(long dd){
  LinkX newLink = new LinkX(dd);
  if(isEmpty())
   last = newLink;
  else
 
   first.previous = newLink;//连接前驱
  
  newLink.next = first;//连接后继
  first = newLink;//newLink成为first
 }
 
 public void insertLast(long dd){
  LinkX newLink = new LinkX(dd);
  
  if(isEmpty())
   last = newLink;
  else{
  
   last.next = newLink;//连接后继
  
   newLink.previous = last;//连接前驱
  }
   last = newLink;//newLink成为last
 }
 
 public LinkX deleteFirst(){
  LinkX temp = first;
  if(first.next==null)
   last = null;
  else
   first.next.previous = null;//将first置null
  first = first.next;//first.next成为新的first
  return temp;
 }
 
 public LinkX deleteLast(){
  LinkX temp = last;
  if(first.next==null)
   first = null;
  else
 
   last.previous.next = null;//断last的前驱
 
  last = last.previous;//last.previous成为新的last
  return temp;
 }
 
 public LinkX deleteKey(long key){
  LinkX current = first;
  while(current.dData!=key){
   current = current.next;
   if(current==null)
    return null;
  
  }//遍历搜索
 
  if(current==first)
   first = current.next;//first-->old next
  else
   current.previous.next = current.next;
  if(current==last)
   last = current.previous;
  else
   current.next.previous = current.previous;
  return current;
 }
 
 public boolean insertAfter(long key,long dd){
  LinkX current = first;
  
  while(current.dData!=key){
   current = current.next;
   if(current==null)
    return false;
  }
  LinkX newLink = new LinkX(dd);
  
  if(current==last){
   newLink.next = null;
   last = newLink;
  }else{
   newLink.next = current.next;
   current.next.previous = newLink;
  }
  newLink.previous = current;
  current.next = newLink;
  return true;
 }
 
 
 
 public void displayForward(){
  System.out.print("List(first-->last): ");
  LinkX current = first;
  while(current!=null){
   current.displayLink();
   current = current.next;
  }
  System.out.println("");
 }
 
 public void displayBackward(){
  System.out.print("List (Last-->first): ");
  LinkX current = last;
  while(current!=null){
   current.displayLink();
   current = current.previous;
  }
  System.out.println("");
 }
}//end class D oublyLinked
public class doublyLinked {
 public static void main(String[] args){
  DoublyLinkedList theList = new DoublyLinkedList();
  
  theList.insertFirst(12);
  theList.insertFirst(112);
  theList.insertFirst(102);
  theList.insertFirst(122);
  theList.insertFirst(132);
  
  theList.insertLast(25);
  theList.insertLast(205);
  theList.insertLast(215);
  
  theList.displayBackward();
  theList.displayForward();
  
  theList.insertAfter(12, 23);
  theList.insertAfter(25, 36);
  
  theList.displayForward();
 }
}

 程序运行结果

 

你可能感兴趣的:(《Java数据结构和算法》双向链表)