0
点赞
收藏
分享

微信扫一扫

简单手写LinkedList

爱薇Ivy趣闻 2022-01-28 阅读 49
package list;

/**
 * @Title:  MyList.java   
 * @Package list   
 * @Description:   
 * @author: PoPse     
 * @date:   2022年1月25日 下午2:34:17
 */
public interface MyList<E> {
	
	public boolean add(E e);
	
	public void add(int index, E element);
	
	public void clear();
	
	public boolean contains(Object o);
	
	public E get(int index);
	
	public int indexOf(Object o);
	
	public boolean isEmpty();
	
	public int lastIndexOf(Object o);
	
	public E remove(int index);
	
	public boolean remove(Object o);
	
	public E set(int index, E element);
	
	public int size();
}

package list;

/**
 * @Title:  MyList.java   
 * @Package list   
 * @Description:   
 * @author: PoPse     
 * @date:   2022年1月25日 下午2:34:17
 */
public interface MyList<E> {
	
	public boolean add(E e);
	
	public void add(int index, E element);
	
	public void clear();
	
	public boolean contains(Object o);
	
	public E get(int index);
	
	public int indexOf(Object o);
	
	public boolean isEmpty();
	
	public int lastIndexOf(Object o);
	
	public E remove(int index);
	
	public boolean remove(Object o);
	
	public E set(int index, E element);
	
	public int size();
}

package list;

import java.util.NoSuchElementException;

/**
 * @Title:  MyLinkedList.java   
 * @Package list   
 * @Description:   
 * @author: PoPse     
 * @date:   2022年1月28日 上午12:06:41
 */

public class MyLinkedList<E> implements MyList<E>, MyDeque<E>{
	
	private static class Node<E> {
		E item;         // 元素内容
		Node<E> next;   // 前驱
		Node<E> prev;   // 后驱
		
		Node(Node<E> prev, E item, Node<E> next) {
			this.prev = prev;
			this.item = item;
			this.next = next;
		}
	}
	
	private int size;              // MyLinkedList长度
	private Node<E> first = null;  // 头指针
	private Node<E> last = null;   // 尾指针
	
	@Override
	public boolean add(E e) {
		// TODO Auto-generated method stub
		Node<E> l = last;
		Node<E> newNode = new Node<>(l, e, null);
		last = newNode;
		if(l == null)
			first = newNode;
		else 
			l.next = newNode;
		size++;
		return true;
	}

	@Override
	public void add(int index, E element) {
		// TODO Auto-generated method stub
		checkElementIndex(index);
		
		if(index == size) {   
			// 插入到末尾
			Node<E> l = last;
			Node<E> newNode = new Node<>(l, element, null);
			last = newNode;
			if(l == null)
				first = newNode;
			else 
				l.next = newNode;
			size++;
		}else {
			// 寻找index插入
			Node<E> x = node(index);
			Node<E> prev = x.prev;
			Node<E> newNode = new Node<>(prev, element, x);
			x.prev = newNode;
			if(prev == null)
				first = newNode;
			else prev.next = newNode;
			size++;
		}
	}

	@Override
	public void clear() {
		// TODO Auto-generated method stub
		for(Node<E> x = first; x != null; ) {
			Node<E> next = x.next;
			x.prev = null;
			x.item = null;
			x.next = null;
			x = next;
		}
		first = last = null;
		size = 0;
	}

	@Override
	public boolean contains(Object o) {
		// TODO Auto-generated method stub
		return indexOf(o) != -1;
	}

	@Override
	public E get(int index) {
		// TODO Auto-generated method stub
		checkElementIndex(index);
		return node(index).item;
	}

	@Override
	public int indexOf(Object o) {
		// TODO Auto-generated method stub
		int index = 0;
		for(Node<E> x = first; x != null; x = x.next) {
			if(o.equals(x.item))
				return index;
			index++;
		}
		return -1;
	}

	@Override
	public boolean isEmpty() {
		// TODO Auto-generated method stub
		return size == 0;
	}

	@Override
	public int lastIndexOf(Object o) {
		// TODO Auto-generated method stub
		int index = size;
		for(Node<E> x = last; x != null; x = x.prev) {
			index--;
			if(o.equals(x.item))
				return index;
		}
		return -1;
	}

	@Override
	public E remove(int index) {
		// TODO Auto-generated method stub
		checkElementIndex(index);
		Node<E> x = node(index);
		E element = x.item;
		Node<E> next = x.next;
		Node<E> prev = x.prev;
		
		if(prev == null) {
			first = null;
		}else {
			prev.next = next;
			x.prev = null;
		}
		
		if(next == null) {
			last = prev;
		}else {
			next.prev = prev;
			x.next = null;
		}
		size--;
		return element;
	}

	@Override
	public boolean remove(Object o) {
		// TODO Auto-generated method stub
		for(Node<E> x = first; x != null; x = x.next) {
			if(o.equals(x.item)) {
				Node<E> next = x.next;
				Node<E> prev = x.prev;
				if(prev == null) {
					first = null;
				}else {
					prev.next = next;
					x.prev = null;
				}
				
				if(next == null) {
					last = prev;
					x.next = null;
				}
				x.item = null;
				size--;
				return true;
			}
		}
		return false;
	}

	@Override
	public E set(int index, E element) {
		// TODO Auto-generated method stub
		checkElementIndex(index);
		Node<E> x = node(index);
		E oldItem = x.item;
		x.item = element;
		return oldItem;
	}

	@Override
	public int size() {
		// TODO Auto-generated method stub
		return size;
	}

	@Override
	public void addFirst(E e) {
		// TODO Auto-generated method stub
		Node<E> f = first;
		Node<E> newNode = new Node<>(null, e, f);
		first = newNode;
		if(f == null)
			last = newNode;
		else 
			f.prev = newNode;
		size++;
	}

	@Override
	public void addLast(E e) {
		// TODO Auto-generated method stub
		Node<E> l = last;
		Node<E> newNode = new Node<>(l, e, null);
		last = newNode;
		if(l == null) 
			first = newNode;
		else {
			l.next = newNode;
		}
		size++;
	}

	@Override
	public E element() {
		// TODO Auto-generated method stub
		return getFirst();
	}

	@Override
	public E getFirst() {
		// TODO Auto-generated method stub
		Node<E> f = first;
		if(f == null)
			throw new NoSuchElementException();
		return f.item;
	}

	@Override
	public E getLast() {
		// TODO Auto-generated method stub
		Node<E> l = last;
		if(l == null)
			throw new NoSuchElementException();
		return l.item;
	}

	@Override
	public E peek() {
		// TODO Auto-generated method stub
		Node<E> f = first;
		return (f == null) ? null : f.item;
	}

	@Override
	public E peekFirst() {
		// TODO Auto-generated method stub
		Node<E> f = first;
		return (f == null) ? null : f.item;
	}

	@Override
	public E peekLast() {
		// TODO Auto-generated method stub
		Node<E> l = last;
		return (l == null) ? null : l.item;
	}

	@Override
	public E pop() {
		// TODO Auto-generated method stub
		return removeFirst();
	}

	@Override
	public void push(E e) {
		// TODO Auto-generated method stub
		addFirst(e);
	}

	@Override
	public E remove() {
		// TODO Auto-generated method stub
		return removeFirst();
	}

	@Override
	public E removeFirst() {
		// TODO Auto-generated method stub
		Node<E> f = first;
		if(f == null)
			throw new NoSuchElementException();
		E element = f.item;
		Node<E> next = f.next;
		f.item = null;
		f.next = null;
		first = next;
		if(next == null)
			last = null;
		else 
			next.prev = null;
		size--;
		return element;
	}

	@Override
	public E removeLast() {
		// TODO Auto-generated method stub
		Node<E> l = last;
		if(l == null)
			throw new NoSuchElementException();
		E element = l.item;
		Node<E> prev = l.prev;
		l.item = null;
		l.prev = null;
		last = prev;
		if(prev == null)
			first = null;
		else 
			prev.next = null;
		size--;
		return element;
	}
	
	public void checkElementIndex(int index) {
		if(index < 0 || index >= size)
			throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
	}
	
	private Node<E> node(int index) {
		Node<E> x = first;
		for(int i = 0; i < index; i++) 
			x = x.next;
		return x;
	}
	
	public static void main(String[] args) {
	}
}

举报

相关推荐

0 条评论