package io.github.vxzh.download;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.NoSuchElementException;
public class LinkedList<E extends Comparable> implements List<E> {
private Node<E> head;
private int size;
@Override
public boolean remove(Object o) {
return false;
}
@Override
public boolean isEmpty() {
return size == 0;
}
@Override
public boolean contains(Object o) {
return false;
}
@Override
public void clear() {
}
/**
* 从头部添加节点
*
* @return
*/
public boolean add(E o) {
Node<E> node = new Node<E>();
node.data = o;
if (null == head) {
head = node;
} else {
node.next = head.next;
head.next = node;
}
size++;
return true;
}
@Override
public void set(int index, E e) {
checkIndex(index);
Node<E> node = new Node<E>();
node.data = e;
Node<E> prev = node(index - 1);
node.next = prev.next;
prev.next = node;
}
public E get(int index) {
checkIndex(index);
return (E) node(index).data;
}
public E remove(int index) {
checkIndex(index);
if (0 == index) {
E data = head.data;
head = head.next;
return data;
}
Node<E> prev = node(index - 1);
E data = (E) prev.next.data;
Node<E> current = prev.next;
prev.next = current.next;
current.next = null;
return data;
}
public int size() {
return size;
}
public void addLast(E o) {
Node<E> node = new Node<E>();
node.data = o;
if (size == 0) {
head = node;
} else {
Node<E> last = node(size - 1);
last.next = node;
}
size++;
}
public E removeFirst() {
checkIndex(0);
E data = head.data;
head = head.next;
size--;
return data;
}
public E removeLast() {
if (size == 0) {
return removeFirst();
}
Node<E> node = node(size - 2);
E data = (E) node.next.data;
node.next = null;
size--;
return data;
}
public Iterator<E> iterator() {
return new It();
}
private void checkIndex(int index) {
if (index < 0 || index > size - 1) {
throw new NoSuchElementException("index " + index + " not found!");
}
}
private class It implements Iterator<E> {
Node<E> currentNode = head;
int currentIndex;
@Override
public boolean hasNext() {
return currentIndex < size - 1;
}
@Override
public E next() {
currentNode = currentNode.next;
currentIndex++;
return currentNode.data;
}
@Override
public void remove() {
if (currentIndex == 0) {
removeFirst();
} else {
Node<E> prev = node(currentIndex - 1);
Node<E> cur = prev.next;
cur.next = null;
prev.next = cur.next;
size--;
}
}
}
private Node<E> node(int index) {
Node<E> current = head;
for (int i = 0; i < size; i++) {
if (index == i) {
return current;
}
current = current.next;
}
return null;
}
private static class Node<E> {
E data;
Node<E> next;
}
/**
* 把该链表逆置
* 例如链表为 3->7->10 , 逆置后变为 10->7->3
*/
public void reverse() {
}
/**
* 删除一个单链表的前半部分
* 例如:list = 2->5->7->8 , 删除以后的值为 7->8
* 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10
*/
public void removeFirstHalf() {
if (isEmpty()) {
return;
}
int half = size / 2;
Node<E> current = head;
for (int i = 0; i < half; i++) {
Node<E> next = current.next;
current.next = null;
current = next;
}
}
/**
* 从第i个元素开始, 删除length 个元素 , 注意i从0开始
*
* @param i
* @param length
*/
public void remove(int i, int length) {
checkIndex(i);
if (i + length > size) {
throw new NoSuchElementException("要删除的元素不存在!");
}
Node<E> current = node(i);
for (int index = i; index <= length; index++) {
Node<E> next = current.next;
current.next = null;
current = next;
}
}
/**
* 假定当前链表和list均包含已升序排列的整数
* 从当前链表中取出那些list所指定的元素
* 例如当前链表 = 11->101->201->301->401->501->601->701
* listB = 1->3->4->6
* 返回的结果应该是[101,301,401,601]
*
* @param list
*/
public static int[] getElements(LinkedList<Integer> list) {
List<Integer> listB = new ArrayList<Integer>();
int[] array = new int[listB.size()];
for (int i = 0; i < array.length; i++) {
array[i] = (Integer) list.get(i);
}
return array;
}
/**
* 已知链表中的元素以值递增有序排列,并以单链表作存储结构。
* 从当前链表中中删除在list中出现的元素
*
* @param list
*/
public void subtract(LinkedList<E> list) {
Node<E> prev = head;
while (prev.next != null) {
if (list.contains(prev.next.data)) {
Node<E> current = prev.next;
prev.next = current.next;
current.next = null;
}
}
prev = head;
if (prev.data == prev.next.data) {
head = prev.next;
prev.next = null;
prev = head;
}
}
/**
* 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。
* 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同)
*/
public void removeDuplicateValues() {
Node<E> prev = head;
while (prev.next != null) {
Node<E> current = prev.next;
if (prev.data == prev.next.data) {//如果前一个的data与当前节点的data同等,就删除当前的
prev.next = current.next;
current.next = null;
}
}
}
/**
* 已知链表中的元素以值递增有序排列,并以单链表作存储结构。
* 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素)
*
* @param min
* @param max
*/
public void removeRange(int min, int max) {
Node<E> prev = head;
while (prev.next != null) {//先删除头节点之后的
Node<E> current = prev.next;
if (min < (Integer) prev.data && (Integer) prev.data < max) {
prev.next = current.next;
current.next = null;
}
}
prev = head;
if (min < (Integer) prev.data && (Integer) prev.data < max) {//如果头节点满足条件,删除头节点
head = prev.next;
prev.next = null;
prev = head;
}
}
/**
* 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同)
* 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列
*
* @param list
*/
public LinkedList<E> intersection(LinkedList<E> list) {
LinkedList<E> ret = new LinkedList<E>();
Iterator<E> it1 = list.iterator();
Iterator<E> it2 = this.iterator();
E data1 = it1.hasNext() ? it1.next() : null;
E data2 = it2.hasNext() ? it2.next() : null;
while (it1.hasNext() || it2.hasNext()) {
if (data1 == null && data2 != null) {
ret.add(data2);
data2 = it2.hasNext() ? it2.next() : null;
} else if (data2 == null && data1 != null) {
ret.add(data1);
data1 = it1.hasNext() ? it1.next() : null;
} else {// if(data1 != null && data2 != null)
if (data1.compareTo(data2) < 0) {
ret.add(data1);
data1 = it1.hasNext() ? it1.next() : null;
} else if (data1.compareTo(data2) > 0) {
ret.add(data2);
data2 = it2.hasNext() ? it2.next() : null;
} else {//equal
ret.add(data1);
data1 = it1.hasNext() ? it1.next() : null;
data2 = it2.hasNext() ? it2.next() : null;
}
}
}
return ret;
}
}