动态链表--用Java语言描述

  • 先定义一个接口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();
  }
  
 }
}

猜你喜欢

转载自blog.csdn.net/w_Antetokounmpo/article/details/88956557