数据结构之表、栈、队列

自己用代码实现表 ArrayList

package Java_advance.Link_Array;

/**
 * ArrayList 类的实现
 * @param <AnyType>
 */
public class MyArrayList<AnyType> implements Iterable<AnyType> {
    public static final int DEFAULT_CAPACITY = 10;

    // MyArrayList 把大小和数组作为数据成员进行存储
    private int theSize;
    private AnyType [] theItems;

    public MyArrayList()
    {
        doClear();
    }

    public void clear()
    {
        doClear();
    }

    private void doClear()
    {
        theSize = 0; ensureCapacity(DEFAULT_CAPACITY);
    }

    public int size()
    {
        return theSize;
    }

    public boolean isEmpty()
    {
        return size() == 0;
    }

    public void trimToSize()
    {
        ensureCapacity(size());
    }

    public AnyType get(int idx)
    {
        if (idx < 0 || idx >= size())
            throw new ArrayIndexOutOfBoundsException();
        return theItems[idx];
    }

    public AnyType set(int idx, AnyType newVal)
    {
        if (idx < 0 || idx >= size())
            throw new ArrayIndexOutOfBoundsException();

        AnyType old = theItems[idx];
        theItems[idx] = newVal;
        return old;
    }

    /**
     *  容量的扩容
     * @param newCapacity
     */
    public void ensureCapacity(int newCapacity)
    {
        // 收缩基本数组,当指定的新容量至少和原大小一样时才试用
        if (newCapacity < theSize)
            return;

        // 存储对原始数组的一个引用
        AnyType [] old = theItems;
        // 为新数组分配内存, 这里类型转换原因是 泛型数组的创建是非法的
        theItems = (AnyType[]) new Object[newCapacity];

        // 将旧的内容拷贝进新数组
        for (int i = 0; i <size(); i++)
            theItems[i] = old[i];
    }

    /**
     * 添加到表的末端并通过调用添加到指定位置
     * @param x
     * @return
     */
    public boolean add(AnyType x)
    {
        add(size(),x);
        return true;
    }

    public void add(int idx, AnyType x)
    {
        if (theItems.length == size())
            ensureCapacity(size() * 2 + 1);
        for (int i = theSize; i > idx; i--)
            theItems[i] = theItems[i - 1];
        theItems[idx] = x;

        theSize++;
    }


    public AnyType remove(int idx)
    {
        AnyType removedItem = theItems[idx];

        for (int i = idx; i < size() - 1; i++)
            theItems[i] = theItems[i + 1];

        theSize--;
        return removedItem;
    }

    public java.util.Iterator<AnyType> iterator()
    {
        // 返回 ArrayListIterator 类的一个实例,该类是一个实现 Iterator接口的类,ArayListIterator存储当前位置的概念
        return new ArrayListIterator();
    }

    // 迭代器三号版本,,迭代器是一个嵌套类并存储当前位置和一个连接到 MyArrayList 的链。它能够使用是因为该嵌套类被认为是 MyArrayList类的一部分
    private class ArrayListIterator implements java.util.Iterator<AnyType>
    {
        private int current = 0;
//        private MyArrayList<AnyType> theList;
//        public ArrayListIterator(MyArrayList<AnyType> list)
//        {
//            theList = list;
//        }

        public boolean hasNext()
        {
//            return current < theList.size();
            return current < size();
        }

        public AnyType next()
        {
            if (!hasNext())
                throw new java.util.NoSuchElementException();

//            return theItems[current++];   这句有问题,theItems 不是 ArrayListIterator的一部分,它是 MyArrayList 的一部分, 因此程序没有意义
//            return theList.theItems[current++];
            return theItems[current++];
        }

        public void remove()
        {
            MyArrayList.this.remove(--current);
        }

    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub    
    }

}

用代码实现 LinkedList

package Java_advance.Link_Array;

import org.omg.CORBA.Any;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.ListIterator;

/**
 * @author 小喵钓鱼
 * @date 2020-02-14 14:11
 * @veision 1.10
 * MyLinkedList 类本身,包含两端的链表,的大小和一些方法
 * Node类
 * LinkedListIterator类
 */
public class MyLinkedList<AnyType> implements Iterable<AnyType>{

    // 嵌套 Node 类
    private static class Node<AnyType>
    {
        // 私有类
        private Node(AnyType d, Node<AnyType> p, Node<AnyType> n )
        {
            data = d;
            prev = p;
            next = n;
        }

        public AnyType data;
        public Node<AnyType> prev;
        public Node<AnyType> next;
    }
    public MyLinkedList()
    {
        doClear();
    }

    public void clear()
    {
        doClear();
    }

    // 创建并连接头节点和尾节点,然后设置大小为0
   private void doClear()
    {
        beginMarker = new Node<AnyType>(null, null, null);
        endMarker = new Node<AnyType>(null, beginMarker, null);

        beginMarker.next = endMarker;

        theSize = 0;
        modCount++;
    }

    public int size()
    {
        return theSize;
    }
    public boolean isEmpty()
    {
        return theSize == 0;
    }

    public boolean add(AnyType x)
    {
        add(size(), x); return true;
    }
    public void add(int idx, AnyType x)
    {
        addBefore(getNode(idx, 0, size()), x);
    }
    public AnyType get(int idx)
    {
        return getNode(idx).data;
    }

    public AnyType set(int idx, AnyType newVal)
    {
        Node<AnyType> p = getNode(idx);
        AnyType oldVal = p.data;
        p.data = newVal;
        return oldVal;
    }

    public AnyType remove(int idx)
    {
        return remove(getNode(idx));
    }

    private void addBefore(Node<AnyType> p, AnyType x)
    {
        Node<AnyType> newNode = new Node<AnyType>(x, p.prev, p);
        newNode.prev.next = newNode;
        p.prev = newNode;
        theSize++;
        modCount++;
    }
    private AnyType remove(Node<AnyType> p)
    {
        p.next.prev = p.prev;
        p.prev.next = p.next;

        theSize--;
        modCount++;

        return p.data;
    }
    private Node<AnyType> getNode(int idx)
    {
        return getNode(idx, 0, size() - 1);
    }
    private Node<AnyType> getNode(int idx, int lower, int upper)
    {
        Node<AnyType> p;
        if (idx < lower || idx > upper)
            throw new IndexOutOfBoundsException();

        if (idx < size() / 2)
        {
            p = beginMarker.next;
            for (int i = 0; i < idx; i++)
                p = p.next;
        }
        else {
            p = endMarker;
            for (int i = size(); i > idx; i--)
            {
                p = p.prev;
            }
        }

        return p;
    }

    public java.util.Iterator<AnyType> iterator()
    {
        return new LinkedListIterator();
    }

    private class LinkedListIterator implements java.util.Iterator<AnyType>
    {
        private Node<AnyType> current = beginMarker.next;
        private int expectedModCount = modCount;
        private boolean okToRemove =false;

        public boolean hasNext()
        {
            return current != endMarker;
        }

        public AnyType next()
        {
            if (modCount != expectedModCount)
                throw new  java.util.ConcurrentModificationException();
            if (!hasNext())
                throw new java.util.NoSuchElementException();

            AnyType nextItem = current.data;
            current = current.next;
            okToRemove = true;
            return nextItem;
        }

        public void remove()
        {
            if (modCount != expectedModCount)
                throw new java.util.ConcurrentModificationException();

            if (!okToRemove)
                throw new IllegalStateException();

            MyLinkedList.this.remove(current.prev);
            expectedModCount++;
            okToRemove = false;
        }
    }

    public boolean contains(AnyType x)
    {
        Node<AnyType> p = beginMarker.next;

        while (p != endMarker && !(p.data.equals(x)))
        {
            p = p.next;
        }
        return (p != endMarker);
    }
    private int theSize;
    // 代表构造以来对链表所改变的次数
    private int modCount = 0;
    // 头节点,尾节点的引用
    private Node<AnyType> beginMarker;
    private Node<AnyType> endMarker;


    public static void main(String[] args) {
        // TODO Auto-generated method stub
        pass(2, 10);  // 下面例题调用
    }
}

一些关于其的例题

1. 给定两个已经排好序的 L1 和 L2, 用基本的表操作写出 计算 L1 且 L2 的过程

 public static <AnyType extends Comparable<? super AnyType>> void insertsection(List<AnyType> L1, List<AnyType> L2, List<AnyType> Intersect)
    {
        ListIterator<AnyType> iterL1 = L1.listIterator();
        ListIterator<AnyType> iterL2 = L2.listIterator();

        AnyType item1 = null, item2 = null;
        if (iterL1.hasNext() && iterL2.hasNext())
        {
            item1 = iterL1.next();
            item2 = iterL2.next();
        }

        while (item1 != null && item2 != null)
        {
            // 比较
            int compareResult = item1.compareTo(item2);
            if (compareResult == 0)
            {
                Intersect.add(item1);
                item1 = iterL1.hasNext()?iterL1.next():null;
                item2 = iterL2.hasNext()?iterL2.next():null;
            }
            else if(compareResult < 0)
            {
                item1 = iterL1.hasNext()?iterL1.next():null;
            }
            else {
                item2 = iterL2.hasNext()?iterL2.next():null;
            }
        }
    }

2. 给定两个已经排好序的 L1 和 L2, 用基本的表操作写出 计算 L1 并 L2 的过程

public static <AnyType extends Comparable<? super AnyType>> void insertSection1(List<AnyType> L1, List<AnyType> L2, List<AnyType> L3)
    {
        // 迭代化
        ListIterator<AnyType> iter1 = L1.listIterator();
        ListIterator<AnyType> iter2 = L2.listIterator();

        // 第一个值
        AnyType item1 = null,item2 = null;
        while (iter1.hasNext() && iter2.hasNext())
        {
            item1 = iter1.next();
            item2 = iter2.next();
        }
        while (item1 != null && item2 !=null)
        {
            int result = item1.compareTo(item2);
            if (result == 0)
            {
                L3.add(item1);
                item1 = iter1.hasNext()?iter1.next():null;
                item2 = iter2.hasNext()?iter2.next():null;
            }
            else if (result < 0)
            {
                // item1 > item2
                L3.add(item1);
                item1 = iter1.hasNext()?iter1.next():null;
            }
            else {
                L3.add(item2);
                item2 = iter2.hasNext()?iter2.next():null;
            }
        }

        while (item1 != null)
        {
            L3.add(item1);
            item1 = iter1.hasNext()?iter1.next():null;
        }
        while (item2 != null)
        {
            L3.add(item2);
            item2 = iter2.hasNext()?iter2.next():null;
        }
    }

3. 传土豆问题,传入 m, n。 n 为圆桌人长度,从 1开始 传递土豆,每传m次,就干掉一个人,直到最后一个人

  public static void pass(int m, int n)
    {
        int i, j, mPrime, numLeft;
        ArrayList<Integer> L = new ArrayList<Integer>();
        for (i = 1; i <= n; i++)
        {
            L.add(i);
        }

        // 转换为迭代
        ListIterator<Integer> iter = L.listIterator();
        Integer item = 0;
        numLeft = n;
        mPrime = m % n;

        for (i = 0; i < n; i++)
        {
            mPrime = m % numLeft;
            if (mPrime <= numLeft / 2)
            {
                if (iter.hasNext())
                {
                    item = iter.next();
                }
                for (j = 0; j < mPrime; j++)
                {
                    if (!iter.hasNext())
                        iter = L.listIterator();
                    item = iter.next();
                }
            }
            else {
                for (j = 0; j < numLeft - mPrime; j++){
                    if (!iter.hasPrevious())
                        iter = L.listIterator(L.size());

                    item = iter.previous();
                }

            }

            System.out.println("Removed " + item + " ");
            iter.remove();
            if (!iter.hasNext())
                iter = L.listIterator();

            System.out.println();
            for (Integer x: L)
                System.out.println(x + " ");
            System.out.println();
            numLeft--;
        }
        System.out.println();
    }

4. 交换链上两个相邻的元素

public class Pratice<AnyType>{

    // 假定一个 Node 类
    private class Node<AnyType>
    {
        private int dData;
        private Node pre;
        private Node next;
    }

    // 1. 只调整链来交换两个相邻的元素, 单链
    public void  swapLink(Node beforeP)
    {
        Node p, afterP;
        p = beforeP.next;
        afterP = p.next;
        // beforeP -> p -> afterP
        beforeP.next = afterP;
        p.next = afterP.next;
        afterP.next = p;
        // beforeP -> afterP -> P;
    }

    // 2. 双向链
    public void doubleSwapLink(Node p)
    {
        Node beforeP, afterP;
        beforeP = p.pre;
        afterP = p.next;

        beforeP.next = afterP;
        p.next = afterP.next;
        afterP.next = p;
        // 因为是双向
        p.next.pre = p;
        p.pre = afterP;
        afterP.pre = beforeP;
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub    
    }
}

猜你喜欢

转载自www.cnblogs.com/xmdykf/p/12307805.html