package com.github.fei9009.coding2017.basic;
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;
public class LinkedListTest extends ListTest {
private LinkedList aLinkedList;
@Before
public void setUpLinkedList() {
aList = new LinkedList();
aLinkedList = new LinkedList();
}
@Test
public void testAddFirst() {
aLinkedList.addFirst(5);
assertEquals(5, aLinkedList.get(0));
aLinkedList.addFirst(6);
assertEquals(6, aLinkedList.get(0));
assertEquals(5, aLinkedList.get(1));
assertEquals(2, aLinkedList.size());
}
@Test
public void testAddLast() {
aLinkedList.addLast("hello");
assertEquals("hello", aLinkedList.get(0));
aLinkedList.addLast("world");
assertEquals("hello", aLinkedList.get(0));
assertEquals("world", aLinkedList.get(1));
assertEquals(2, aLinkedList.size());
}
@Test
public void testRemoveFirst() {
aLinkedList.addLast("hello");
aLinkedList.addLast("world");
aLinkedList.removeFirst();
assertEquals("world", aLinkedList.get(0));
assertEquals(1, aLinkedList.size());
aLinkedList.removeFirst();
assertEquals(0, aLinkedList.size());
}
@Test
public void testRemoveLast() {
aLinkedList.addFirst("world");
aLinkedList.addFirst("hello");
aLinkedList.removeLast();
assertEquals("hello", aLinkedList.get(0));
assertEquals(1, aLinkedList.size());
aLinkedList.removeLast();
assertEquals(0, aLinkedList.size());
}
@Test
public void testLinkedListFunctional() {
for (int i = 1; i < 4; i++) {
aLinkedList.add(i); // [1,2,3]
}
aLinkedList.remove(1); // [1,3]
aLinkedList.add(1, 0); // [1,0,3]
for (int i = 4; i < 6; i++) {
aLinkedList.addFirst(i); // [5, 4, 1, 0, 3]
}
assertEquals(5, aLinkedList.size());
assertEquals(5, aLinkedList.get(0));
assertEquals(1, aLinkedList.get(2));
assertEquals(0, aLinkedList.get(3));
aLinkedList.remove(3); // [5, 4, 1, 3]
assertEquals(3, aLinkedList.get(aLinkedList.size() - 1));
aLinkedList.removeLast(); // [5, 4, 1]
assertEquals(1, aLinkedList.get(aLinkedList.size() - 1));
aLinkedList.removeFirst(); // [4,1]
assertEquals(4, aLinkedList.get(0));
assertEquals(1, aLinkedList.get(1));
assertEquals(2, aLinkedList.size());
}
@Test
public void testReverse() {
// 测试当aLinkedList为空时的情况
aLinkedList.reverse();
assertEquals(0, aLinkedList.size());
// 测试当aLinkedList长度为1时的情况
aLinkedList.add(4);
aLinkedList.reverse();
assertEquals(1, aLinkedList.size());
assertEquals(4, aLinkedList.get(0));
for (int i = 1; i < 4; i++) {
aLinkedList.add(i); // [4,1,2,3]
}
aLinkedList.reverse();
assertEquals(4, aLinkedList.size());
assertEquals(3, aLinkedList.get(0));
assertEquals(2, aLinkedList.get(1));
assertEquals(1, aLinkedList.get(2));
assertEquals(4, aLinkedList.get(3));
}
/**
* 删除一个单链表的前半部分
* 例如:list = 2->5->7->8 , 删除以后的值为 7->8
* 如果list = 2->5->7->8->10, 删除以后的值为7,8,10
*/
@Test
public void testRemoveFirstHalf() {
aLinkedList.removeFirstHalf();
assertEquals(0, aLinkedList.size());
aLinkedList.add(2);
aLinkedList.add(5);
aLinkedList.add(7);
aLinkedList.add(8); // [2,5,7,8]
aLinkedList.removeFirstHalf(); // [7,8]
assertEquals(2, aLinkedList.size());
assertEquals(7, aLinkedList.get(0));
assertEquals(8, aLinkedList.get(1));
aLinkedList.add(10); // [7,8,10]
aLinkedList.removeFirstHalf(); // [8,10]
assertEquals(2, aLinkedList.size());
assertEquals(8, aLinkedList.get(0));
assertEquals(10, aLinkedList.get(1));
aLinkedList.removeFirstHalf(); // [10]
aLinkedList.removeFirstHalf(); // [10]
assertEquals(1, aLinkedList.size());
assertEquals(10, aLinkedList.get(0));
}
/**
* 从第i个元素开始, 删除length 个元素 , 注意i从0开始
*
* @param i
* @param length
*/
@Test
public void testRemoveIntInt() {
for (int i = 0; i < 4; i++) {
aLinkedList.add(i); // [0,1,2,3]
}
expectedEx.expect(Exception.class);
aLinkedList.remove(1, -1);
expectedEx.expect(Exception.class);
aLinkedList.remove(-1, 1);
aLinkedList.remove(0, 2); // [2,3]
assertEquals(2, aLinkedList.size());
assertEquals(2, aLinkedList.get(0));
assertEquals(3, aLinkedList.get(1));
aLinkedList.remove(1, 0);
aLinkedList.remove(0, 0);
assertEquals(2, aLinkedList.size());
aLinkedList.remove(1, 1); // [2]
assertEquals(1, aLinkedList.size());
assertEquals(2, aLinkedList.get(0));
aLinkedList.remove(0, 1); // []
assertEquals(0, aLinkedList.size());
expectedEx.expect(Exception.class);
aLinkedList.remove(1, 3);
}
/**
* 假定当前链表和list均包含已升序排列的整数 从当前链表中取出那些list所指定的元素
* 例如当前链表 = 11->101->201->301->401->501->601->701 listB = 1->3->4->6
* 返回的结果应该是[101,301,401,601]
*
* @param list
*/
@Test
public void testGetElements() {
for (int i = 0; i < 4; i++) {
aLinkedList.add(i * i); // [0,1,4,9]
}
LinkedList bLinkedList = new LinkedList();
int[] z1 = aLinkedList.getElements(bLinkedList); // []
assertArrayEquals(new int[0], z1);
bLinkedList.add(1);
bLinkedList.add(3); // [1, 3]
z1 = aLinkedList.getElements(bLinkedList); // [1, 9]
assertArrayEquals(new int[] { 1, 9 }, z1);
bLinkedList.add(1, 2); // bLinkedList = [1, 2, 3]
z1 = aLinkedList.getElements(bLinkedList); // [1, 4, 9]
assertArrayEquals(new int[] { 1, 4, 9 }, z1);
bLinkedList.add(0, 0); // bLinkedList = [0, 1, 2, 3]
z1 = aLinkedList.getElements(bLinkedList); // [0, 1, 4, 9]
assertArrayEquals(new int[] { 0, 1, 4, 9 }, z1);
// aLinkedList不应该变化
assertEquals(4, aLinkedList.size());
for (int i = 0; i < 4; i++) {
assertEquals(i * i, aLinkedList.get(i)); // [0,1,4,9]
}
// Exception
bLinkedList.add(5); // bLinkedList = [0, 1, 2, 3, 5]
expectedEx.expect(Exception.class);
z1 = aLinkedList.getElements(bLinkedList);
}
@Test
public void TestSubtract() {
// 传进的list为null,什么都不干
LinkedList list = null;
for (int i = 0; i < 6; i++) {
aLinkedList.add(i); // [0,1,2,3,4,5]
}
aLinkedList.subtract(list);
assertEquals(6, aLinkedList.size());
for (int i = 0; i < 6; i++) {
assertEquals(i, aLinkedList.get(i)); // [0,1,2,3,4,5]
}
// 传进的list为空链表
list = new LinkedList();
aLinkedList.subtract(list);
assertEquals(6, aLinkedList.size());
for (int i = 0; i < 6; i++) {
assertEquals(i, aLinkedList.get(i)); // [0,1,2,3,4,5]
}
aLinkedList.add(1, 1); // [0,1,1,2,3,4,5]
aLinkedList.add(4, 3); // [0, 1, 1, 2, 3, 3, 4, 5]
// list添加元素[0, 1, 3, 7]
list.add(0);
list.add(1);
list.add(3);
list.add(7);
aLinkedList.subtract(list); // [2, 4, 5]
assertEquals(3, aLinkedList.size());
assertEquals(2, aLinkedList.get(0));
assertEquals(4, aLinkedList.get(1));
assertEquals(5, aLinkedList.get(2));
}
@Test
public void testRemoveDuplicateValues() {
aLinkedList.add(3);
aLinkedList.add(3);
aLinkedList.add(3);
aLinkedList.add(4);
aLinkedList.add(5);
aLinkedList.add(6);
aLinkedList.add(6); // [3, 3, 3, 4, 5, 6, 6]
aLinkedList.removeDuplicateValues(); // [3, 4, 5, 6]
assertEquals(4, aLinkedList.size());
assertEquals(3, aLinkedList.get(0));
assertEquals(4, aLinkedList.get(1));
assertEquals(5, aLinkedList.get(2));
assertEquals(6, aLinkedList.get(3));
}
@Test
public void testRemoveRange() {
for (int i = 0; i < 6; i++) {
aLinkedList.add(i); // [0, 1, 2, 3, 4, 5] //考虑重复元素
}
aLinkedList.addFirst(0); // [0, 0, 1, 2, 3, 4, 5]
aLinkedList.add(3, 2); // [0, 0, 1, 2, 2, 3, 4, 5]
aLinkedList.removeRange(1, 4); // 大于1小于4 [0, 0, 1, 4, 5]
assertEquals(5, aLinkedList.size());
assertEquals(0, aLinkedList.get(0));
assertEquals(0, aLinkedList.get(1));
assertEquals(1, aLinkedList.get(2));
assertEquals(4, aLinkedList.get(3));
assertEquals(5, aLinkedList.get(4));
// 若出现 min >= max的情况,什么都不做
aLinkedList.removeRange(4, 1);
assertEquals(5, aLinkedList.size());
assertEquals(0, aLinkedList.get(0));
assertEquals(0, aLinkedList.get(1));
assertEquals(1, aLinkedList.get(2));
assertEquals(4, aLinkedList.get(3));
assertEquals(5, aLinkedList.get(4));
// 将整个链表中的元素删除
aLinkedList.removeRange(-1, 9);
assertEquals(0, aLinkedList.size());
}
@Test
public void testIntersection() {
for (int i = 0; i < 6; i++) {
aLinkedList.add(i);
}
aLinkedList.add(6);
aLinkedList.add(7); // [0, 1, 2, 3, 4, 5, 6, 7]
// list为null
LinkedList list = null;
LinkedList newList1 = aLinkedList.intersection(list);
assertNull(newList1);
// list为空链表
list = new LinkedList();
LinkedList newList2 = aLinkedList.intersection(list);
assertEquals(0, newList2.size());
list.add(0);
list.add(3);
list.add(4);
list.add(7);
list.add(8); // [0, 3, 4, 7, 8]
LinkedList newList3 = aLinkedList.intersection(list);
assertEquals(4, newList3.size());
assertEquals(0, newList3.get(0));
assertEquals(3, newList3.get(1));
assertEquals(4, newList3.get(2));
assertEquals(7, newList3.get(3));
}
}