删除链表中的索引值

时间:2014-03-07 05:14:56

标签: java linked-list nodes

我正在编写一个方法removeEvens,它从列表中删除偶数索引中的值,返回一个包含原始顺序的值的新列表。这笔交易是我正在实现我自己的链表,我不能使用java.util中的LinkedList。

例如,如果变量list1存储这些值:

**list1: [8, 13, 17, 4, 9, 12, 98, 41, 7, 23, 0, 92]**
And the following call is made:

**LinkedIntList list2 = list1.removeEvens();** 
After the call, list1 and list2 should store the following values:

**list1: [13, 4, 12, 41, 23, 92]
list2: [8, 17, 9, 98, 7, 0]**

该方法位于此链接列表类

public class LinkedIntList {
    private ListNode front;   // null for an empty list
    ...
}

ListNode类中的字段:

public int data;          // data stored in this node
public ListNode next;     // link to next node in the list

我的代码(已更新)

public LinkedIntList removeEvens(){
    LinkedIntList b = new LinkedIntList();
    b.front = front;
    if(front == null) {  
        System.out.println("The list inputed it empty");
    }
    else {   
        ListNode even = b.front;
        while(even!=null && even.next!=null ) { 
            int toBeAdded = even.next.data;
            even.next = even.next.next;
            add(toBeAdded);
            even = even.next;
        }
    }
    return b;
}

我的输出
enter image description here

更新输出:

enter image description here

似乎我已将偶数索引的值存储在新列表(list2)中,但如何将(奇数索引的)剩余值存储在原始列表(list1)中?

5 个答案:

答案 0 :(得分:2)

解决这个问题的一种方法是返回一个LinkedIntList类型的List,然后以这种二维方式返回两个列表(一个用于奇数,一个用于偶数),如下所示:

public List<LinkedIntList> removeEvens(){
    List<LinkedIntList> 2dOutput = new ArrayList<>();
    LinkedIntList odd  = new LinkedIntList();
    LinkedIntList even = new LinkedIntList();
    ListNode temp = front;
    even.front=temp;
    if(front == null) {  
        System.out.println("The list inputed is empty");
    }else if(front.next == null){
        odd.front = null;
        front = null;
    }else {

        ListNode current =front.next;
        odd.front = current;
        while(temp != null){
            current.next = current.next.next;
            current = current.next;

            temp.next = temp.next.next;        
            temp = temp.next;          
        }
    }
    2dOutput.add(even);
    2dOutput.add(odd);
    return 2dOutput;
}

值得注意的是,我没有测试过这个,但我很确定这会成功地将两者分开。

我不确定你在最后发布的输出字段是什么,所以无论它是什么,都可能要你格式化它有点不同。

祝你好运!

答案 1 :(得分:2)

我假设您在LinkedIntList类中有addTail(),以在列表的末尾添加一个新节点。

您的代码看起来像这样。没试过,但它应该有效。

public LinkedIntList removeEvens(){
    LinkedIntList b = new LinkedIntList();

    if(front == null) {  
        System.out.println("The list inputed it empty");
    }
    else {   
        ListNode current = front.next; // current node always points to an odd node
        b.addTail(front); // add first node (even) to list
        front = current: // front now points to first odd node.

        // while there is odd node and the next node (even node) is not null
        while(current!=null && current.next != null) { // need to remove even node
                ListNode toBeAdded = current.next; // save the node to be removed
                current.next = current.next.next;
                b.addTail(toBeAdded);
                current = current.next;
        }
    }

    size -= b.size(); // new list size is old list size minus total removed nodes.
    return b;
}

答案 2 :(得分:1)

您需要更改节点中元素之间的链接,并确保“奇数”列表中的第一个元素与偶数列表中的第一个元素不同。

最初你有:

1 -> 2 -> 3 -> 4

要拥有两个单独的节点列表:

  1. 维护对节点12
  2. 的引用
  3. 更新1->32->4
  4. 等链接

答案 3 :(得分:1)

这是经过测试的问题代码。 在这里,当你打电话删除evens。列表将仅包含evens,而新列表b将仅包含奇数

公共类LinkedIntList {     私有ListNode前端;

public LinkedIntList removeEvens()
    {
        LinkedIntList b = new LinkedIntList();
        ListNode temp = front;
        int count=0;

        ListNode evenPrev=null;
        ListNode oddLast=null;


        while(temp!=null)
        {

        if(count%2==0)
        {
            evenPrev=temp;
            temp=temp.next;
        }
        else
        {
                    if(oddLast==null)
                {
                b.front=temp;
                oddLast=temp;   
            }
            else
            {
                oddLast.next=temp;
                oddLast=oddLast.next;
            }

            evenPrev.next=temp.next;
            temp=temp.next;
            oddLast.next=null;      
        }
                count++;
    }
    return b;
}

public void display()
{
        ListNode temp=front;
        while(temp!=null)
        {
            System.out.println(temp.data);
            temp=temp.next;
        }
}


    public static void main(String []args)
{      
        LinkedIntList a=new LinkedIntList();
        ListNode aLast=null;

        for(int i=0;i<11;i++)
        {
                ListNode temp=new ListNode();
                temp.data=i;
                if(a.front==null)
                {
                    a.front=temp;
                    aLast=temp;
                }
                else
                {
                    aLast.next=temp;
                    aLast=aLast.next;
                }
        }

        a.display();

        LinkedIntList b=a.removeEvens();

        a.display();
        b.display();

    }

}

类ListNode {     公共数据; //存储在此节点中的数据     public ListNode next; //链接到列表中的下一个节点
}

答案 4 :(得分:0)

试试这个:

public LinkedIntList removeEvens () {
    LinkedIntList list2 = new LinkedIntList();

    for (int i = 0; i < size(); i++) {
        list2.add(get(i));
        remove(i);
    }    
    return list2;
}