双链表 (java版)

package src;

//doublyLinked.java
//demonstrates doubly-linked list
//to run this program: C>java DoublyLinkedApp

class Link
{
public long dData;                 // data item
public Link next;                  // next link in list
public Link previous;              // previous link in list
//-------------------------------------------------------------
public Link(long d)                // constructor
   { dData = d; }
//-------------------------------------------------------------
public void displayLink()          // display this link
   { System.out.print(dData + " "); }
//-------------------------------------------------------------
}  // end class Link

class DoublyLinkedList
{
private Link first;               // ref to first item
private Link last;                // ref to last item
//-------------------------------------------------------------
public DoublyLinkedList()         // constructor
   {
   first = null;                  // no items on list yet
   last = null;
   }
//-------------------------------------------------------------
public boolean isEmpty()          // true if no links
   { return first==null; }
//-------------------------------------------------------------
public void insertFirst(long dd)  // insert at front of list
   {
   Link newLink = new Link(dd);   // make new link
   if(isEmpty())                // if empty list,
      last = newLink;             // newLink <-- last
   else
   first.previous = newLink;   // newLink <-- old first
   newLink.next = first;          // newLink --> old first
   first = newLink;               // first --> newLink
   }
//-------------------------------------------------------------
public void insertLast(long dd)   // insert at end of list
   {
   Link newLink = new Link(dd);   // make new link
   if( isEmpty() )                // if empty list,
      first = newLink;            // first --> newLink
   else
      {
      last.next = newLink;        // old last --> newLink
      newLink.previous = last;    // old last <-- newLink
      }
   last = newLink;                // newLink <-- last
   }
//-------------------------------------------------------------
public Link deleteFirst()         // delete first link
   {                              // (assumes non-empty list)
   Link temp = first;
   if(first.next == null)         // if only one item
      last = null;                // null <-- last
   else
      first.next.previous = null; // null <-- old next
   first = first.next;            // first --> old next
   return temp;
   }
//-------------------------------------------------------------
public Link deleteLast()          // delete last link
   {                              // (assumes non-empty list)
   Link temp = last;
   if(first.next == null)         // if only one item
      first = null;               // first --> null
   else
      last.previous.next = null;  // old previous --> null
   last = last.previous;          // old previous <-- last
   return temp;
   }
//-------------------------------------------------------------
                                  // insert dd just after key
public boolean insertAfter(long key, long dd)
   {                              // (assumes non-empty list)
   Link current = first;          // start at beginning
   while(current.dData != key)    // until match is found,
      {
      current = current.next;     // move to next link
      if(current == null)
         return false;            // didn't find it
      }
   Link newLink = new Link(dd);   // make new link

   if(current==last)              // if last link,
      {
      newLink.next = null;        // newLink --> null
      last = newLink;             // newLink <-- last
      }
   else                           // not last link,
      {
      newLink.next = current.next; // newLink --> old next
                                   // newLink <-- old next
      current.next.previous = newLink;
      }
   newLink.previous = current;    // old current <-- newLink
   current.next = newLink;        // old current --> newLink
   return true;                   // found it, did insertion
   }
//-------------------------------------------------------------
public Link deleteKey(long key)   // delete item w/ given key
   {                              // (assumes non-empty list)
   Link current = first;          // start at beginning
   while(current.dData != key)    // until match is found,
      {
      current = current.next;     // move to next link
      if(current == null)
         return null;             // didn't find it
      }
   if(current==first)             // found it; first item?
      first = current.next;       // first --> old next
   else                           // not first
                                  // old previous --> old next
      current.previous.next = current.next;

   if(current==last)              // last item?
      last = current.previous;    // old previous <-- last
   else                           // not last
                                  // old previous <-- old next
      current.next.previous = current.previous;
   return current;                // return value
   }
//-------------------------------------------------------------
public void displayForward()
   {
   System.out.print("List (first-->last): ");
   Link current = first;          // start at beginning
   while(current != null)         // until end of list,
      {
      current.displayLink();      // display data
      current = current.next;     // move to next link
      }
   System.out.println("");
   }
//-------------------------------------------------------------
public void displayBackward()
   {
   System.out.print("List (last-->first): ");
   Link current = last;           // start at end
   while(current != null)         // until start of list,
      {
      current.displayLink();      // display data
      current = current.previous; // move to previous link
      }
   System.out.println("");
   }
//-------------------------------------------------------------
}  // end class DoublyLinkedList

class DoublyLinkedApp
{
public static void main(String[] args)
   {                             // make a new list
   DoublyLinkedList theList = new DoublyLinkedList();

   theList.insertFirst(22);      // insert at front
   theList.insertFirst(44);
   theList.insertFirst(66);

   theList.insertLast(11);       // insert at rear
   theList.insertLast(33);
   theList.insertLast(55);

   theList.displayForward();     // display list forward
   theList.displayBackward();    // display list backward

   theList.deleteFirst();        // delete first item
   theList.deleteLast();         // delete last item
   theList.deleteKey(11);        // delete item with key 11

   theList.displayForward();     // display list forward

   theList.insertAfter(22, 77);  // insert 77 after 22
   theList.insertAfter(33, 88);  // insert 88 after 33

   theList.displayForward();     // display list forward
   }  // end main()
}  // end class DoublyLinkedApp

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值