- 本文已参加「新人创作礼活动」,一起开启掘金之路。
- 以前学的知识,现在有时间重新整理一下。
List接口
package 数据结构.Day03;
public interface List<E> {
int size();
int indexOf(E element);
boolean contains(E element);
E get(int index);
E set(int index,E element);
void clear();
void add(E element);
void add(int index,E element);
E remove(int index);
boolean isEmpty();
}
AbstractList
package 数据结构.Day03;
public abstract class AbstractList<E> implements List<E> {
protected int size=0;
protected static final int ELEMENT_NOT_FOUND=-1;
@Override
public int size() {
return size;
}
public boolean contains(E element) {
return indexOf(element)!=ELEMENT_NOT_FOUND;
}
@Override
public void add(E element) {
add(size,element);
}
public boolean isEmpty() {
return size==0;
}
public void checkIndex(int index) {
if(index<0 || index>=size) {
throw new ArrayIndexOutOfBoundsException("下标越界,允许范围:size 0=>"+(size-1)+"当前索引为:"+index);
}
}
public void checkAddIndex(int index) {
if(index<0 || index>size) {
throw new ArrayIndexOutOfBoundsException("下标越界,允许范围:size 0=>"+size+"当前索引为:"+index);
}
}
}
双向链表
package 数据结构.Day04;
import 数据结构.Day03.AbstractList;
public class LinkedListDouble<E> extends AbstractList<E> {
private Node<E> first;
private Node<E> last;
private class Node<E> {
E element;
Node<E> pre;
Node<E> next;
public Node(Node<E> pre, Node<E> next, E element) {
this.element = element;
this.pre = pre;
this.next = next;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
if(pre!=null) {
sb.append(pre.element);
}else {
sb.append("null");
}
sb.append("<-").append(element).append("->");
if(next!=null) {
sb.append(next.element);
}else {
sb.append("null");
}
return sb.toString();
}
}
@Override
public E get(int index) {
checkIndex(index);
return node(index).element;
}
private Node<E> node(int index) {
checkIndex(index);
if(index< (size>>1)) {
Node<E> node=first;
for(int i=0;i<index;i++) {
node = node.next;
}
return node;
}else {
Node<E> node=last;
for(int i=size-1;i>index;i--) {
node=node.pre;
}
return node;
}
}
@Override
public E set(int index,E element) {
checkIndex(index);
Node<E> node = node(index);
E old = node.element;
node.element=element;
return old;
}
@Override
public void clear() {
size=0;
first=null;
last=null;
}
@Override
public int indexOf(E element) {
Node<E> node=first;
if(element==null) {
for(int i=0;i<size;i++) {
if(node.element==null) {
return i;
}
node=node.next;
}
}else {
for(int i=0;i<size;i++) {
if(element.equals(node.element)) {
return i;
}
node=node.next;
}
}
return ELEMENT_NOT_FOUND;
}
@Override
public void add(int index, E element) {
checkAddIndex(index);
if(index==size) {
Node<E> oldLast=last;
last=new Node<E>(oldLast,null,element);
if(oldLast==null) {
first=last;
}else {
oldLast.next=last;
}
}else {
Node<E> next = node(index);
Node<E> pre = next.pre;
Node<E> node = new Node<E>(pre, next, element);
next.pre=node;
if(pre==null) {
first = node;
}else {
pre.next=node;
}
}
size++;
}
@Override
public E remove(int index) {
checkIndex(index);
Node<E> node = node(index);
Node<E> pre = node.pre;
Node<E> next = node.next;
if(pre==null) {
first=next;
}else {
pre.next=next;
}
if(next==null) {
last=pre;
}else {
next.pre=pre;
}
size--;
return node.element;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("size:" + size + " => [");
Node<E> node=first;
for(int i=0;i<size;i++) {
if(i!=0) {
sb.append(" ,");
}
sb.append(node.toString());
node=node.next;
}
sb.append("]");
return sb.toString();
}
}
单向循环链表
package 数据结构.Day04;
import 数据结构.Day03.AbstractList;
public class LinkedListSingleCircle<E> extends AbstractList<E> {
private Node<E> first;
private class Node<E> {
E element;
Node<E> next;
public Node( Node<E> next,E element) {
this.element = element;
this.next = next;
}
}
@Override
public E get(int index) {
checkIndex(index);
return node(index).element;
}
private Node<E> node(int index) {
checkIndex(index);
Node<E> node=first;
for(int i=0;i<index;i++) {
node = node.next;
}
return node;
}
@Override
public E set(int index,E element) {
checkIndex(index);
Node<E> node = node(index);
E old = node.element;
node.element=element;
return old;
}
@Override
public void clear() {
size=0;
first=null;
}
@Override
public int indexOf(E element) {
Node<E> node=first;
if(element==null) {
for(int i=0;i<size;i++) {
if(node.element==null) {
return i;
}
node=node.next;
}
}else {
for(int i=0;i<size;i++) {
if(element.equals(node.element)) {
return i;
}
node=node.next;
}
}
return ELEMENT_NOT_FOUND;
}
@Override
public void add(int index, E element) {
checkAddIndex(index);
if(index==0) {
Node<E> newFirst = new Node<>(first, element);
Node<E> last = (size==0)? newFirst: node(size - 1);
last.next=newFirst;
first=newFirst;
}else {
Node<E> pre = node(index - 1);
Node<E> next = pre.next;
pre.next=new Node(next,element);
}
size++;
}
@Override
public E remove(int index) {
checkIndex(index);
Node<E> oldNode=first;
if(index==0) {
if(size==1) {
first=null;
}else {
Node<E> last = node(size - 1);
first=first.next;
last.next=first;
}
}else {
Node<E> pre = node(index - 1);
oldNode = pre.next;
pre.next=pre.next.next;
}
size--;
return oldNode.element;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("size:" + size + " => [");
Node<E> node=first;
for(int i=0;i<size;i++) {
if(i!=0) {
sb.append(" ,");
}
sb.append(node.element);
node=node.next;
}
sb.append("]");
return sb.toString();
}
}
双向循环链表
package 数据结构.Day04;
import 数据结构.Day03.AbstractList;
public class LinkedListDoubleCircle<E> extends AbstractList<E> {
private Node<E> first;
private Node<E> last;
private class Node<E> {
E element;
Node<E> pre;
Node<E> next;
public Node(Node<E> pre, Node<E> next, E element) {
this.element = element;
this.pre = pre;
this.next = next;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
if(pre!=null) {
sb.append(pre.element);
}else {
sb.append("null");
}
sb.append("<-").append(element).append("->");
if(next!=null) {
sb.append(next.element);
}else {
sb.append("null");
}
return sb.toString();
}
}
@Override
public E get(int index) {
checkIndex(index);
return node(index).element;
}
private Node<E> node(int index) {
checkIndex(index);
if(index< (size>>1)) {
Node<E> node=first;
for(int i=0;i<index;i++) {
node = node.next;
}
return node;
}else {
Node<E> node=last;
for(int i=size-1;i>index;i--) {
node=node.pre;
}
return node;
}
}
@Override
public E set(int index,E element) {
checkIndex(index);
Node<E> node = node(index);
E old = node.element;
node.element=element;
return old;
}
@Override
public void clear() {
size=0;
first=null;
last=null;
}
@Override
public int indexOf(E element) {
Node<E> node=first;
if(element==null) {
for(int i=0;i<size;i++) {
if(node.element==null) {
return i;
}
node=node.next;
}
}else {
for(int i=0;i<size;i++) {
if(element.equals(node.element)) {
return i;
}
node=node.next;
}
}
return ELEMENT_NOT_FOUND;
}
@Override
public void add(int index, E element) {
checkAddIndex(index);
if(index==size) {
Node<E> oldLast=last;
last=new Node<E>(oldLast,first,element);
if(oldLast==null) {
first=last;
first.pre=first;
first.next=first;
}else {
oldLast.next=last;
first.pre=last;
}
}else {
Node<E> next = node(index);
Node<E> pre = next.pre;
Node<E> node = new Node<E>(pre, next, element);
next.pre=node;
pre.next=node;
if(index==0) {
first = node;
}
}
size++;
}
@Override
public E remove(int index) {
checkIndex(index);
Node<E> node=first;
if(size==1) {
first=null;
last=null;
}else {
node = node(index);
Node<E> pre = node.pre;
Node<E> next = node.next;
pre.next=next;
next.pre=pre;
if(index==0) {
first=next;
}
if(index==size-1) {
last=pre;
}
}
size--;
return node.element;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("size:" + size + " => [");
Node<E> node=first;
for(int i=0;i<size;i++) {
if(i!=0) {
sb.append(" ,");
}
sb.append(node.toString());
node=node.next;
}
sb.append("]");
return sb.toString();
}
}
相关测试代码
package 数据结构.Day04;
public class Test04 {
public static void main(String[] args) {
System.out.println("双向链表:");
LinkedListDouble<Object> doubleList = new LinkedListDouble<>();
doubleList.add(1);
doubleList.add(2);
doubleList.add(3);
System.out.println(doubleList);
doubleList.add(0,4);
System.out.println(doubleList);
doubleList.remove(3);
System.out.println(doubleList);
System.out.println("单循环链表:");
LinkedListSingleCircle<Object> sc = new LinkedListSingleCircle<>();
sc.add(1);
sc.add(2);
sc.add(3);
System.out.println(sc);
sc.add(0,4);
System.out.println(sc);
sc.remove(1);
System.out.println(sc);
System.out.println("双循环链表:");
LinkedListDoubleCircle<Object> db = new LinkedListDoubleCircle<>();
db.add(2);
db.add(3);
db.add(4);
db.add(1,6);
System.out.println(db);
db.remove(0);
System.out.println(db);
}
}