Java LinkedList移除(int-from,int-to)方法

Java LinkedList移除(int-from,int-to)方法,java,doubly-linked-list,Java,Doubly Linked List,由于节点主要由其链接(下一个和上一个)定义,因此删除一组节点与仅删除一个节点基本相同。你有一个链-1-2-3-4-5-并且你移除了一些链接:-1-2-3-4-5- public LinkedList<Elem<E>> remove(int from, int to) { Elem<E> left = head; for (int i=0; i < from; i++) { left = left.n

由于节点主要由其链接(下一个和上一个)定义,因此删除一组节点与仅删除一个节点基本相同。你有一个链-1-2-3-4-5-并且你移除了一些链接:-1-2-3-4-5-

public LinkedList<Elem<E>> remove(int from, int to) 
{
    Elem<E> left = head;      
    for (int i=0; i < from; i++) 
    {
        left = left.next;

    }
    Elem<E> right = left;
    for(int i = 0; i< to - from; i++){
      right = right.next;
    }
    // removing the elements from the list;
    left.next = right;
    right.previous = left;
    size -= to - from;

    //left to right are still linked, so just shove them into
    //a new linkedlist and return.
    LinkedList<Elem<E>> ret = new LinkedList<Elem<E>>();
    ret.head = left;
    ret.tail = right;
    return ret;
}
public LinkedList<Elem<E>> remove(int from, int to) 
{
    Elem<E> left = head;      
    for (int i=0; i < from; i++) 
    {
        left = left.next;

    }
    Elem<E> right = left;
    for(int i = 0; i< to - from; i++){
      right = right.next;
    }
    // removing the elements from the list;
    left.next = right;
    right.previous = left;
    size -= ((to - from)+1);

    //left to right are still linked, so just shove them into
    //a new linkedlist and return.
    LinkedList<E> ret = new LinkedList<E>();
    ret.head = left;
    ret.tail = right;
    return ret;
}
公共链接列表删除(int-from,int-to)
{
元素左=头部;
for(int i=0;i
测试等级:

import junit.framework.Assert;
import junit.framework.TestCase;
import junit.framework.TestSuite;

public class TestAll extends TestCase {

    public static void testRemoveStart() {

 List<Integer> l1, l2;

 l1 = new LinkedList<Integer>();

 for (int i=0; i<10; i++) {
     l1.add(i);
 }

 l2 = l1.remove(0, 4);

 Assert.assertEquals(5, l2.size());

 for (int i=0; i<5; i++) {
     Assert.assertEquals(new Integer(i), l2.get(i));
 }

 Assert.assertEquals(5, l1.size());

 for (int i=0; i<5; i++) {
     Assert.assertEquals(new Integer(i+5), l1.get(i));
 }

    }

    public static void testRemoveMiddle() {

 List<Integer> l1, l2;

 l1 = new LinkedList<Integer>();

 for (int i=0; i<10; i++) {
     l1.add(i);
 }

 l2 = l1.remove(3, 7);

 Assert.assertEquals(5, l2.size());

 for (int i=0; i<5; i++) {
     Assert.assertEquals(new Integer(i+3), l2.get(i));
 }

 Assert.assertEquals(5, l1.size());

 for (int i=0; i<3; i++) {
     Assert.assertEquals(new Integer(i), l1.get(i));
 }

 for (int i=3; i<5; i++) {
     Assert.assertEquals(new Integer(i+5), l1.get(i));
 }

    }

    public static void testRemoveLast() {

 List<Integer> l1, l2;

 l1 = new LinkedList<Integer>();

 for (int i=0; i<10; i++) {
     l1.add(i);
 }

 l2 = l1.remove(5, 9);

 Assert.assertEquals(5, l2.size());

 for (int i=0; i<5; i++) {
     Assert.assertEquals(new Integer(i+5), l2.get(i));
 }

 Assert.assertEquals(5, l1.size());

 for (int i=0; i<5; i++) {
     Assert.assertEquals(new Integer(i), l1.get(i));
 }

    }

    public static void testRemoveOne() {

 List<Integer> l1, l2;

 l1 = new LinkedList<Integer>();

 for (int i=0; i<10; i++) {
     l1.add(i);
 }

 l2 = l1.remove(5, 5);

 Assert.assertEquals(1, l2.size());

 Assert.assertEquals(new Integer(5), l2.get(0));

 Assert.assertEquals(9, l1.size());

 for (int i=0; i<5; i++) {
     Assert.assertEquals(new Integer(i), l1.get(i));
 }

 for (int i=5; i<9; i++) {
     Assert.assertEquals(new Integer(i+1), l1.get(i));
 }

    }

    public static void testExceptions() {

 List<Integer> l;

 l = new LinkedList<Integer>();

 for (int i=0; i<10; i++) {
     l.add(i);
 }

 boolean flag = false;
 try {
     l.remove(-5, -1);
 } catch (IllegalArgumentException e) {
     flag = true;
 } catch (Exception e) {
     ;
 }
 Assert.assertTrue(flag);

 for (int i=0; i<10; i++) {
     Assert.assertEquals(new Integer(i), l.get(i));
 }

 flag = false;
 try {
     l.remove(-1, 5);
 } catch (IllegalArgumentException e) {
     flag = true;
 } catch (Exception e) {
     ;
 }
 Assert.assertTrue(flag);

 for (int i=0; i<10; i++) {
     Assert.assertEquals(new Integer(i), l.get(i));
 }

 flag = false;
 try {
     l.remove(0, 10);
 } catch (IllegalArgumentException e) {
     flag = true;
 } catch (Exception e) {
     ;
 }
 Assert.assertTrue(flag);

 for (int i=0; i<10; i++) {
     Assert.assertEquals(new Integer(i), l.get(i));
 }

 flag = false;
 try {
     l.remove(5, 4);
 } catch (IllegalArgumentException e) {
     flag = true;
 } catch (Exception e) {
     ;
 }
 Assert.assertTrue(flag);

 for (int i=0; i<10; i++) {
     Assert.assertEquals(new Integer(i), l.get(i));
 }

    }


    /**
     * Runs the test suite using the textual runner.
     */

    public static void main( String[] args ) {
 TestSuite suite = new TestSuite();
 suite.addTestSuite( TestAll.class );
 junit.textui.TestRunner.run( suite );
    }

}
import junit.framework.Assert;
导入junit.framework.TestCase;
导入junit.framework.TestSuite;
公共类TestAll扩展了TestCase{
公共静态void testRemoveStart(){
列表l1、l2;
l1=新的LinkedList();

对于(int i=0;i假设
from
to
都包含在内,则替换此

Elem<E> right = left.next.next;

其他一切都保持不变。

由于节点主要由其链接(下一个和上一个)定义,因此删除一组节点与仅删除一个节点基本相同。您有一个链-1-2-3-4-5-并且删除了一些链接:-1 2-3-4 5-

public LinkedList<Elem<E>> remove(int from, int to) 
{
    Elem<E> left = head;      
    for (int i=0; i < from; i++) 
    {
        left = left.next;

    }
    Elem<E> right = left;
    for(int i = 0; i< to - from; i++){
      right = right.next;
    }
    // removing the elements from the list;
    left.next = right;
    right.previous = left;
    size -= to - from;

    //left to right are still linked, so just shove them into
    //a new linkedlist and return.
    LinkedList<Elem<E>> ret = new LinkedList<Elem<E>>();
    ret.head = left;
    ret.tail = right;
    return ret;
}
public LinkedList<Elem<E>> remove(int from, int to) 
{
    Elem<E> left = head;      
    for (int i=0; i < from; i++) 
    {
        left = left.next;

    }
    Elem<E> right = left;
    for(int i = 0; i< to - from; i++){
      right = right.next;
    }
    // removing the elements from the list;
    left.next = right;
    right.previous = left;
    size -= ((to - from)+1);

    //left to right are still linked, so just shove them into
    //a new linkedlist and return.
    LinkedList<E> ret = new LinkedList<E>();
    ret.head = left;
    ret.tail = right;
    return ret;
}
公共链接列表删除(int-from,int-to)
{
元素左=头部;
for(int i=0;i
基本上是相同的原理,只是在找到第一个删除点后,您将迭代另一个
到-from-1
节点,然后执行与原始删除方法相同的节点重新分配。这似乎可行。唯一的问题是我没有跟踪尾部。好吧,“左”仍然保留它的next,它仍然有自己的next等等。本质上,这个想法是,即使您从主linkedlist中删除这些节点,它们本身就是另一个linkedlist,这就是您需要返回的内容。因此,在方法的结尾,我有以下内容:
linkedlist ret=new linkedlist()
ret.head=left;
ret.size=to+from;
return-ret;
由于某种原因,它与我的预期结果不匹配。它如何不匹配?项目从原始数组中删除是正确的还是提取的链接列表在某种程度上弄乱了?呜呜,我编辑了你的答案,而不是编辑了我的问题。很抱歉。无论如何,我已经发布了我的测试用例和收到的结果。谢谢!