简体   繁体   English

如何使用remove方法删除链表中的第一个节点

[英]How do I remove the first node in a linked list with a remove method

I want to create a linked list then populate it with 1-100. 我想创建一个链表,然后用1-100填充它。 After that I print out all the even numbers without actually removing the odd numbers from the list, then print out the even numbers again, but double them. 之后,我打印出所有的偶数,而没有实际从列表中删除奇数,然后再次打印出偶数,但是将它们加倍。 After these things, I remove the odd numbers from the linked list and print out the list. 完成这些操作后,我从链接列表中删除了奇数并打印出列表。 The last step that I have mentioned is where I am hung up. 我提到的最后一步是挂断电话。 Everything else works fine, just my remove method removes all the odd numbers except 1. In my main method I use an if statement that says if the number contained in the node % 2 equals zero, remove the node. 其他一切工作正常,只是我的remove方法删除了除1以外的所有奇数。在我的主要方法中,我使用了if语句,该语句说如果节点%2中包含的数字等于零,则删除该节点。 It works for every node except the first one. 它适用于除第一个节点以外的每个节点。 Thank you guys for any help you can give me. 谢谢你们给我的任何帮助。 My code follows. 我的代码如下。

import java.util.*;

/*
 * My ListNode class
 */
class ListNode<Integer> {
private Integer item;
private ListNode<Integer> next;

public ListNode(Integer item) {
    this.item = item;
    next = null;
}

public ListNode(Integer item, ListNode<Integer> next) {
    this.item = item;
    this.next = next;
}

public Integer getItem() {
    return item;
}

public ListNode<Integer> getNext() {
    return next;
}

public void setItem(Integer item) {
    this.item = item;
}

public void setNext(ListNode<Integer> next) {
    this.next = next;

}   
}

/*
 * My LinkedList class
 */
class LinkedList<Integer> {
public ListNode<Integer> front;

public LinkedList() {
    front = null;
}

public boolean isEmpty() {
    return front == null;
}

 public boolean contains(int target) {
     for (ListNode<Integer> node = front;
          node != null;
          node = node.getNext()) {
         if (node.getItem().equals(target)) {
             return true;
         }
     }
     return false;
 }

 public int size() {
     int count = 0;
     for (ListNode<Integer> node = front;
          node != null;
          node = node.getNext()) {
         count++;
     }
     return count;
 }

 public String toString() {
     String result = "( ";
     for (ListNode<Integer> node = front;
          node != null;
          node = node.getNext()) {
         result += node.getItem() + " ";
     }
     return result + ")";
 }

 public Integer get(int index) {
     ListNode<Integer> node = front;
     for (int i = 0; i < index; i++) {
         node = node.getNext();
     }
     return node.getItem();
 }

 public void set(int index, Integer target) {
     ListNode<Integer> node = front;
     for (int i = 0; i < index; i++) {
         node = node.getNext();
     }
     node.setItem(target);
 }

 public void add(int index, int target) {
     if (isEmpty()) {
         front = new ListNode(target);
     } else {
         ListNode last = front;
         while (last.getNext() != null) {
             last = last.getNext();
         }
         last.setNext(new ListNode(target));
     }
 }

 public Integer remove(int index) {
     ListNode<Integer> node = front;
     ListNode<Integer> prev = front;
     for (int i = 0; i < index; i++) {
         prev = node;
         node = node.getNext();
 }
     prev.setNext(node.getNext());
     return node.getItem();
}
 }
public class LinkedListTest {
//interface Removal {
    //Integer remove (Integer item);
//}
public static void main(String[] args) {
    LinkedList<Integer> list = new LinkedList<Integer>();

    System.out.println(list);

    System.out.println("The list size is " + list.size());      
    System.out.println();

    /*
     * This adds the numbers 1 through 100 to a LinkedList
     */
    for (int i = 1; i <= 100; i++)
        list.add(0, i);

    System.out.println(list);


    System.out.println("The list size is " + list.size());
    System.out.println();

    /*
     * This prints out only even numbers by excluding indexes that are even,
     * because all the even numbers are held in the odd numbered indexes, thus 
     * index 0 is 1 but index 1 is 2, index 3 is 4
     */
    for (int i = 0; i < list.size(); i++) 
        if (i % 2 == 1) {
            System.out.print(list.get(i) + " ");
        }

    System.out.println();

    System.out.println("The list size is " + list.size());
    System.out.println();

    /*
     * This doubles even numbers                    
     */
    for (int i = 0; i < list.size(); i++) 
        if (i % 2 == 1) {
            int result = list.get(i) * 2;
        System.out.print(result + " ");
        }
    System.out.println();
    System.out.println("The list size is " + list.size());
    System.out.println();

    for (int i = 0; i < list.size(); i++) 
            if (list.get(i) % 2 == 1) {
                list.remove(i);
            }

    System.out.print(list);
    System.out.println();
    System.out.println("The list size is " + list.size());
    System.out.println();
    /*
     * These contain methods only work for the first list created
     */
    System.out.println("Does the list contain 32? " + list.contains(32));

    System.out.println("Does the list contain 33? " + list.contains(33));

}   
}

Your remove method doesn't actually work when value of index is 0 .. Because both your node and prev are initialized to front and the loop is not being executed because the i<index condition is false. index值为0时, remove方法实际上不起作用。.因为i<index条件为false,所以您的nodeprev都被初始化为front并且未执行循环。 So you have to add another condition for the case of index=0 Adding these lines at the starting of your remove method solves the problem.. 因此,对于index=0的情况,您必须添加另一个条件。在remove方法的开头添加这些行即可解决此问题。

if(index==0){
    ListNode<integer>temp=front;
    front=front.getNext();
    return temp.getItem();
}

hope it helped... 希望它能帮助...

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM