天天看点

数据结构---单链表实现线性表

数据结构---单链表实现线性表
数据结构---单链表实现线性表
数据结构---单链表实现线性表
数据结构---单链表实现线性表

             动态链表就是链式存储结构具体实现的核心思想

           linkedSinglyList就是线性结构链式存储方式的具体实现,称为单链表

package 动态链表;

import 动态数组.ArrayList;
import 接口.List;

import java.util.Comparator;
import java.util.Iterator;

//单向链表
public class LinkedSinglyList<E> implements List<E> {
  //定义一个结点,用内部类来实现
    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;
      }
      public String toString(){
          return  data.toString();//由data的类型指定toString的内容
      }

  }
    //定义一个头指针,指向第一个头结点的对象
    private Node head;
    //定义一个尾指针
    private Node tail;
    //定义一个有效元素的个数,指向最后一个结点的对象
    private int size;
    public LinkedSinglyList(){
        head=null;
        tail=null;
        size=0;
    }
    public LinkedSinglyList(E [] arr){
        for(E e:arr){
            add(e);
        }
    }

    @Override
    public void add(E element) {
       add(size,element);//注意这里的角标都是虚拟的,链表是不存在角标的
    }

    @Override
    public void add(int index, E element) {
        if(index<0||index>size){
            throw new ArrayIndexOutOfBoundsException("角标不存在");
        }
        //创建一个新结点
        Node node =new Node(element);
        //1,链表为空
        if(isEmpty()){
            head=node;
            tail=node;
//            size++;
        }
        //2,表头添加
        else if(index==0){
            //在表头添加
            node.next=head;
            head=node;

        }
        //3,在表尾添加
        else if(index==size){
            tail.next=node;//node.next只是一个形象化的代称而已
            tail=node;
        }
        else{
            //4,在表中间添加元素
            Node p =head;
            for(int i=0;i<index-1;i++){
                p=p.next;
            }
            node.next =p.next;
            p.next=node;

        }
        size++;
    }

    @Override
    public void remove(E element) {
        int index=indexOf(element);
        if(index!=-1){
            remove(index);
        }
    }
 //删除链表指定角标处的元素
    @Override
    public E remove(int index) {
        if(index<0||index>=size){
            throw new ArrayIndexOutOfBoundsException("角标不存在");
        }
        E ret =null;
        //1,当链表只剩一个元素
        if(size==1){
            ret =head.data;
            head=null;
            tail=null;

        }
        //2,如果是表头
        else if(index==0){
            Node del=head;
            ret =del.data;//和head.data是同一个值
            head  =del.next;
            del.next=null;
        }
        //3,删除表尾元素
        else if(index==size-1){
           Node p=head;
           while(p.next!=tail){
               p=p.next;
           }
           ret =tail.data;
           p.next=null;
           tail=p;

        }
        else{
            //4,删除中间某一个元素
            Node p=head;
            for(int i=0;i<index-1;i++){
                p=p.next;
            }
            //要删除的结点
            Node del =p.next;
            ret =del.data;
            p.next=del.next;
            del.next=null;

        }
        size--;
        return ret;
    }
   //获取链表中指定角标的元素
    @Override
    public E get(int index) {
        if(index<0||index>=size){
            throw new ArrayIndexOutOfBoundsException("角标不存在");
        }
        //1,获取头
        if(index==0){
            return head.data;
        }
        else if(index==size-1){
            //获取尾部
            return tail.data;
        }
        else{
            //获取中间
            Node p=head;
            for(int i=0;i<index;i++){//直接获取到本身
                p=p.next;
            }
            return p.data;
        }
        //return null;
    }
   //修改链表中指定角标的元素
    @Override
    public E set(int index, E element) {
        if(index<0||index>=size){
            throw new ArrayIndexOutOfBoundsException("角标不存在");
        }
        E ret =null;
        //1,修改头
        if(index==0){
            ret =head.data;
            head.data =element;
        }
        else if(index==size-1){
            ret = tail.data;
            tail.data= element;
        }
        else{
            //3,修改中间
            Node p=head;
            for(int i=0;i<index;i++){
                p=p.next;
            }
            ret =p.data;
            p.data=element;
        }
        return ret;
    }

    @Override
    public int size() {
        return size;
    }
//查找元素在链表中第一次出现的角标
    @Override
    public int indexOf(E element) {
         Node p=head;
         int index=0;
         while(!p.data.equals(element)){
             p=p.next;index++;
             if(p==null){
                 return -1;
             }
         }

        return index;
    }
//在链表中判断是否包含元素element
    @Override
    public boolean contains(E element) {

        return indexOf(element)!=-1;
    }

    @Override
    public boolean isEmpty() {
        return size==0&&head==null&&tail==null;
    }

    @Override
    public void clear() {
    head =null;
    tail =null;
    size=0;
    }

    @Override
    public void sort(Comparator<E> c) {
        if(c==null){
            throw new IllegalArgumentException("比较器c不能为空");
        }
//        int j;
//        E e =null;
//        for(int i=1;i<size;i++){
//            e =get(i);
//            for(j=i;j>0&&c.compare(get(j-1),e)>0;j--){
//               set(j,get(j-1));
//            }
//            set(j,e);
//        }
        //改进
        if(size==0||size==1){
            return;
        }
        Node A =head;
        Node B=A.next;
        while (true){
            while (true){
                if(c.compare(A.data,B.data)>0){
                    swap(A,B);
                }

                if(B==tail) {
                    break;
                }
                B =B.next;
            }
            if(A.next==tail){
                break;
            }
            A=A.next;
            B=A.next;
        }
    }

    private void swap(Node a, Node b) {
        E temp=a.data;
        a.data=b.data;
        b.data=temp;
    }

    @Override
    public List<E> subList(int fromIndex, int toIndex) {
        //先判断条件是否满足
        if(fromIndex<0){
            throw new IllegalArgumentException("fromIndex不能小于0");
        }
        if(toIndex>=size){
            throw new IllegalArgumentException("toIndex不能>=size");
        }
        if(toIndex<fromIndex){
            throw new IllegalArgumentException("toIndex不能大于fromIndex");
        }
        //创建一个线性表
        LinkedSinglyList<E>  subList =new LinkedSinglyList<>();
//        for(int i=fromIndex;i<=toIndex;i++){
//            //默认在表尾添加
//            subList.add(get(i));
//        }
        //改进
        Node A =head;
        for(int i=0;i<fromIndex;i++){
            A=A.next;
        }
        Node B =head;
        for(int i=0;i<toIndex;i++){
            B=B.next;
        }
        Node p=A;
        while (true){
            subList.add(p.data);
            if(p==B){
                break;
            }
            p=p.next;
        }
        return subList;
    }
    public String toString(){
        StringBuilder sb =new StringBuilder(String.format("LinkedSinglyList:%d[",size));
        if(isEmpty()){
            sb.append("]");
        }
        else{
            Node p=head;
            while (true){
                sb.append(p.data);
                 if(p==tail){
                     sb.append("]");
                     break;
                 }
                 sb.append(",");
                 p=p.next;

            }
        }
        return sb.toString();

    }


    @Override
    public Iterator<E> iterator() {
        return new LinkedSinglyIterator();
    }
    class LinkedSinglyIterator implements Iterator<E>{
   private Node cur =head;

        @Override
        public boolean hasNext() {
            return cur!=null;
        }

        @Override
        public E next() {
            E ret =cur.data;
            cur=cur.next;
            return ret;
        }
    }

}
           

继续阅读