在双向链接列表中创建自己的删除方法

时间:2011-10-21 14:56:28

标签: java linked-list

我需要在双向链接列表中创建一个删除方法。我遇到了麻烦,因为我认为我需要有4个案例。

  1. 如果列表为空
  2. 如果要删除的节点是头
  3. 如果节点是尾部
  4. 如果节点位于列表中间的某个位置
  5. 这是我到目前为止的代码。

    public void delete(Node n) {
        if (head == null) {
            System.out.println("the list is empty");
        } else if (head != null) {
            head = n;
            Node newHead = n.next;
            newHead = head;
        } else if (n.next == null) {
            Node beforeTail = n.previous;
            beforeTail.next = null;
        } else if (n.next != null || n.previous != null) {
            Node inFront = n.previous;
            Node inBack = n.next;
            inFront.next = inBack;
            inBack.previous = inFront;
        } else {
            System.out.println("error");
        }
    }
    

    以下是测试程序:

     public class TestLL {
     public static void main(String[] args){ 
         /*Create a bunch of free standing nodes */ 
         Node n1= new Node(new Integer(11)); 
         Node n2= new Node(new Integer(12)); 
         Node n3= new Node(new Integer(13)); 
         Node n4= new Node(new Integer(14)); 
         Node n5= new Node(new Integer(15)); 
         Node n6= new Node(new Integer(16)); 
         Node n7= new Node(new Integer(17)); 
    
         /* link them */ 
         LL myLL =new LL(); 
         myLL.printList(); // prints "empty list"
         myLL.add(n1); //11 
         myLL.add(n3); //13 
         myLL.add(n5); //15 
         myLL.add(n2); //12 
         myLL.add(n7); //17 
         myLL.printList(); //should print 11, 13, 15, 12, 17; one per line 
         System.out.println(); 
         myLL.delete(n3); 
         myLL.addAfter(n4,n1); 
         myLL.printList(); //should print 11,14,15,12,17 one per line 
         System.out.println(); 
         myLL.delete(n7); 
         myLL.delete(n2); 
         myLL.printList();//should print 11,14,15 one per line 
             } 
         }
    

    我真的不知道该怎么做。此外,我不能使用Java中已有的任何方法。

1 个答案:

答案 0 :(得分:1)

很难说但是LL方法看起来不对。通常使用LL不需要任何“节点”意识,因为由实现来处理所有链接细节。调用的代码应该传入它选择的对象。

我希望LL的使用看起来像这样。

LL myLL = new LL();
myLL.add(new Integer(1));
myLL.add(new Integer(2));
// etc

myLL.remove(new Integer(1));

在调用添加新节点(内部类到LL)的过程中,将创建并附加到末尾。删除/删除将搜索LL并删除与传入的对象匹配的第一个实例。

e.g。 LL实现的草图。

class LL
{
   private Node headNode = null;

   public void add(Object item)
   {
      // construct a new node
      // iterate to the last node and add new node to the end
   }

   public boolean remove(Object item)
   {
      // starting at the head node search the list until a node with the matching item is found
      // update the node pointers to "remove" the node
   }

   class Node
   {
       Node nextNode;
       Node prevNode;
       Object item;
   }
}

我不会填写实现,因为这是作业;)但你是对的,有几个案件需要处理

  • 列表为空
  • 项目不存在
  • 项目位于头节点
  • 项目位于另一个节点
祝你好运!