【问题标题】:How to properly remove one node from a generic linked list?如何从通用链表中正确删除一个节点?
【发布时间】:2019-04-19 02:14:43
【问题描述】:

我试图从通用链表中删除一个节点,而不是删除整个列表。我希望它删除一项类似类型的项目。我正在尝试找到正确的方法。我还需要它去最后一个节点准备删除一个节点后添加一个节点。







import java.util.Scanner;


import java.io.*;


class MyGenericList <T extends Comparable<T> >
{
    private  class Node<B>
     {
        T value;
        Node<T>  next;
     }   

     private Node<T> first = null;
     int count = 0;

    public void  add(T element)
     {
         Node<T> newnode = new Node<T>();
         newnode.value = element;
         newnode.next = null;

        if (first == null)
        {
            first = newnode;
        }
        else
        {
            Node<T> lastnode = gotolastnode(first);
            lastnode.next = newnode;
        }
         count++;
     }

    public void remove(T element)
    {
        Node<T> newnode = new Node<T>();
        Node<T> prevnode = new Node<T>();
        Node<T> curnode = new Node<T>();

        prevnode.value = element;
        curnode.next = null;
        int hopcount=0;

        while(hopcount < count)
        {
            if(prevnode == element)
            {
                prevnode.next = first;
                Node<T> lastnode = gotolastnode(first);
                lastnode.next = newnode;
            }

            hopcount++;
        }
        count--;
       }

    public T get(int pos)
    {
         Node<T> Nodeptr = first;
         int hopcount=0;
         while (hopcount < count && hopcount<pos)
         {   if(Nodeptr != null)
             {
                Nodeptr = Nodeptr.next;
             }
             hopcount++;
         }
        return  Nodeptr.value;
    }

    private Node<T> gotolastnode(Node<T> nodepointer) 
    {
       if (nodepointer== null )
        {
          return nodepointer;
        } 
        else
        {
            if (nodepointer.next == null)
               return nodepointer;
            else
                 return gotolastnode( nodepointer.next);

        }

    }
}

class Employee implements Comparable<Employee>
{
    String name;
    int age;
    @Override
    public int compareTo(Employee arg0) 
    {
        // TODO Auto-generated method stub
        return 0;
        // implement compareto method here. 
    }
    Employee( String nm, int a)
    {
        name =nm;
        age = a;
    }
}

class City implements Comparable<City>
{

    String name;
    int population;
    City( String nm, int p)
    {
        name =nm;
        population = p;
    }
    @Override
    public int compareTo(City arg0) {
        // TODO Auto-generated method stub
        return 0;
        // implement compareto method here. 
    }

}
public class GenericLinkedList
{

    public static void main(String[] args) throws IOException
    {
        MyGenericList<Employee> ml = new MyGenericList<>();

        ml.add(new Employee("john", 32));
        ml.add(new Employee("susan", 23));
        ml.add(new Employee("dale", 45));
        ml.add(new Employee("eric", 23));

        Employee e1 = ml.get(0);
       System.out.println(  "Name " + e1.name + " Age "+ e1.age );

       ml.remove(new Employee("john", 32));
       System.out.println(  "Name " + e1.name + " Age "+ e1.age );

       ml.add(new Employee("john", 32));
       System.out.println(  "Name " + e1.name + " Age "+ e1.age );


       MyGenericList<City> citylist = new MyGenericList<>();

        citylist.add(new City("Los Angeles", 320000));
        citylist.add(new City("Santa monica", 230000));
        citylist.add(new City("San Francisco", 450000));
        citylist.add(new City("San Diego", 23000));
        City c= citylist.get(2);
        System.out.println(  "City " + c.name + " Population "+ c.population );
    }
}







我不想删除整个列表,而是想删除一个。

【问题讨论】:

    标签: java linked-list comparable generic-list


    【解决方案1】:

    在处理数据结构时,在尝试编写代码之前先处理实际情况的图表可能特别有用。一起来看看吧:

    如我们所见,我们只需将 prev 指向 cur 之外的节点(我们需要删除的节点)。步骤如下:

    1) 声明两个节点,第一个指向first(prev),第二个指向prev之后的节点。

    2)使用while循环将cur和prev递增到正确的位置(cur应该指向要删除的节点)。

    3)用一行代码删除节点(prev.next = cur.next)。

    4)递减计数,你就完成了。

    (如果您需要为 addLast 操作定位,只需将 cur 移动到最后一个节点,即 cur = cur.next while cur.next!=null)。

    按值删除的完整代码如下:

     public void remove(T element){
    
        Node<T> cur = first.next;
        Node<T> prev = first;
        Node<T> nn = new Node(element);//I'm assuming you have constructors that accept data
        boolean deleted = false;
    
        while(cur!=null&&deleted == false){
               if(cur.data.equals(element)){
                             prev.next = cur.next;
                             this.count--;
                             deleted = true;
    
                         }
    
            }
    
    prev = gotolastnode(prev);
    prev.next = nn;
    }
    

    这应该根据您的删除方法签名起作用。但是,您可能必须更改您的 gotolastnode 方法才能使其正常工作。

    【讨论】:

    • 现在如果我想让它从用户输入中删除一个节点,我是否只需要使用 prev 直到它到达用户输入的节点?
    • 你会增加 cur 直到你到达所需的节点。
    • 我更新了它,但我不确定我做错了什么。
    猜你喜欢
    • 2021-05-05
    • 2020-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-06
    相关资源
    最近更新 更多