- 先定义一个接口List,接口中定义需要实现的功能。
package 动态数组;
public interface List<E> {
public int getSize();//获取列表中元素个数
public boolean isEmpty();//判断当前列表是否为空
public void add(int index,E e);//在列表中指定角标index处添加元素e
public void addFirst(E e); //在列表中第一个位置添加元素e
public void addLast(E e);//在列表中最后一个位置添加元素e
public E get(int index);//获取列表中指定角标index处的元素
public E getFirst();//获取列表中第一个位置的元素
public E getLast();//获取列表中最后一个位置的元素
public E remove(int index);//删除列表中指定角标位置的元素并返回
public E removeFirst();//删除列表中第一个位置的元素
public E removeLast();//删除列表中最后一个位置的元素
public void set(int index,E e);//修改列表中指定角标index位置处的元素为新元素e
public boolean contains(E e);//判断列表中是否包含指定元素e
public int find(E e);//在列表中查找指定元素e的角标
public void removeElement(E e);//在列表中删除指定元素e
public void clear();//清空列表
}
- 此时,定义一个ArrayList类,实现了List接口,实例化List接口中的所有方法。
对于一个链表来说,它的定义是有很大的扩展性的,在下面的链表中,我们定义一个头指针和一个尾指针,再定义能描述链表个数的值size.当链表为空时,我们指定rear=head并且指定 size=0.
import 动态数组.List;public class LinkedList<E> implements List<E>{
private Node head;//头指针
private Node rear;//尾指针
private int size; //元素个数
public LinkedList() {
head=new Node(); //创建虚拟头节点
rear=head;
size=0;
}
private class Node{
E data;
Node next;
public Node() {
this(null,null);
}
public Node(E data){
this(data,null);
}
public Node(E data,Node next){
this.data=data;
this.next=next;
}
}
@Override
public int getSize() {
return size;
}
@Override
public boolean isEmpty() {
return size==0;
}
@Override
public void add(int index, E e) {
if(index<0||index>size){
throw new IllegalArgumentException("角标非法!");
}
Node n=new Node(e);//封装节点
if(index==0){//头插
n.next=head.next;
head.next=n;
if(isEmpty()){//第一次添加元素 要更新尾指针
rear=n;
}
}else if(index==size){//尾插
n.next=rear.next;
rear.next=n;
rear=n;
}else{//中间插
Node p=head;
for(int i=0;i<index;i++){
p=p.next;
}
n.next=p.next;
p.next=n;
}
size++;
}
@Override
public void addFirst(E e) {
add(0,e);
}
@Override
public void addLast(E e) {
add(size,e);
}
@Override
public E get(int index) {
if(index<0||index>=size){
throw new IllegalArgumentException("角标非法!");
}
if(index==0){//表头
return head.next.data;
}else if(index==size-1){//表尾
return rear.data;
}else{//中间
Node p=head;
for(int i=0;i<=index;i++){
p=p.next;
}
return p.data;
}
}
@Override
public E getFirst() {
return get(0);
}
@Override
public E getLast() {
return get(size-1);
}
@Override
public E remove(int index) {
if(index<0||index>=size){
throw new IllegalArgumentException("角标非法!");
}
E res=null;
if(index==0){//删除头
Node n=head.next;
res=n.data;
head.next=n.next;
n=null;
if(size==1){//删除最后一个元素
rear=head;
}
}else if(index==size-1){//删除尾
res=rear.data;
Node p=head;
while(p.next!=rear){
p=p.next;
}
p.next=rear.next;
rear=p;
}else{//删中间
Node p=head;
for(int i=0;i<index;i++){
p=p.next;
}
Node n=p.next;
res=n.data;
p.next=n.next;
n=null;
}
size--;
return res;
}
@Override
public E removeFirst() {
return remove(0);
}
@Override
public E removeLast() {
return remove(size-1);
}
@Override
public void set(int index, E e) {
if(index<0||index>=size){
throw new IllegalArgumentException("角标非法");
}
Node p=head;
for(int i=0;i<=index;i++){
p=p.next;
}
p.data=e;
}
@Override
public boolean contains(E e) {
return false;
}
@Override
public int find(E e) {
if(isEmpty()){
return -1;
}
int index=-1;
Node p=head;
while(p.next!=null){
index++;
p=p.next;
if(p.data.equals(e)){
return index;
}
}
return -1;
}
@Override
public void removeElement(E e) {
int index=find(e);
if(index!=-1){
remove(index);
}
}
@Override
public void clear() {
head.next=null;
rear=head;
size=0;
}
@Override
public String toString() {
StringBuilder sb=new StringBuilder();
if(isEmpty()){
return "[]";
}else{
sb.append("[");
Node p=head;
while(true){
p=p.next;
if(p==rear){
sb.append(p.data+"]");
break;
}else{
sb.append(p.data+",");
}
}
return sb.toString();
}
}
}