由于节点主要由它的链路(下一个和前)中所定义,去掉一组节点的是大多相同除去只有一个节点。你有一个链-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:空
它的原理基本相同,不同之处在于定位第一去除点之后,你会遍历其他'来 - 从 - 1'节点,然后执行同一种节点重新分配,你在原来的删除方法做。 – Perception 2013-04-09 20:47:31