2013-04-09 72 views
0

由于节点主要由它的链路(下一个和前)中所定义,去掉一组节点的是大多相同除去只有一个节点。你有一个链-1-2-3-4-5-,你删除了一些链接:-1 2-3-4 5-。链表删除(从,INT到int)方法

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; 
} 

测试类:

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); 
    } 

} 

以下是错误我得到:

5次测试失败: TestAll testRemoveStart testRemoveMiddle testRemoveLast testRemoveOne testExceptions 文件:C:\ Users \ Mikros0ft \ Google Drive \ Semester 2 \ ITI1121 \ Assignment 4 \ 3 \ Te stAll.java [line:30] 失败:junit.framework.AssertionFailedError:expected:< 5>但是:< 4> File:C:\ Users \ Mikros0ft \ Google Drive \ Semester 2 \ ITI1121 \ Assignment 4 \ 3 \ TestAll.java [line:56] 失败:junit.framework.AssertionFailedError:expected:< 5>但是:< 10> File:C:\ Users \ Mikros0ft \ Google Drive \ Semester 2 \ ITI1121 \ Assignment 4 \ 3 \ TestAll.java [line:86] 失败:junit.framework.AssertionFailedError:expected:< 5>但是:< 14> 文件:C:\ Users \ Mikros0ft \ Google Drive \ Semester 2 \ ITI1121 \作业4 \ 3 \ TestAll.java [行:112] 失败:junit.framework.AssertionFailedError:期望值< 1>但瓦特为:< 10> 文件:C:\用户\ Mikros0ft \谷歌驱动器\ 2学期\ ITI1121 \作业4 \ 3 \ TestAll.java [行:146] 失败:junit.framework.AssertionFailedError:空

+2

它的原理基本相同,不同之处在于定位第一去除点之后,你会遍历其他'来 - 从 - 1'节点,然后执行同一种节点重新分配,你在原来的删除方法做。 – Perception 2013-04-09 20:47:31

回答

0

由于节点通过其链接大多定义(下一个和前一个),去除节点的集合是大多相同除去只有一个节点。你有一个链-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)+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; 
} 
+0

这看起来好像会起作用。唯一的问题是我没有跟踪尾巴。 – mikros0ft 2013-04-09 21:11:55

+0

好,“左”仍持有其下,仍然保有其自身的未来等 从本质上讲,这个想法是,即使你从主链表中删除这些节点,它们在自己的另一个链表,这是所有你需要返回。 – 2013-04-09 21:34:37

+0

所以这是我的方法的末尾: 'LinkedList的 RET =新的LinkedList ();'' RET。head = left;' 'ret.size = to + from;' 'return ret;' 由于某种原因,它与我预期的结果不符。 – mikros0ft 2013-04-09 21:48:12

0

假设,fromto都是包容,更换此

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

通过

Elem<E> right = left.next; 
for (int i = 0; i <= to - from; i++) 
    right = right.next 

size也改变。

size -= to - from + 1 

其他一切保持不变。