2013-04-09 74 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 

其他一切保持不變。