Java实现的单链表

Node结点的创建

private class Node {// 结点
		/*
		 * 1.数据域 2.指针域
		 */
		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;
		}

	}

单链表实现list接口

package p02.动态链表;

import 顺序表.List;

public class SingleLinkList<E> implements List<E> {
	private Node head;
	private Node rear;
	private int size;

	public SingleLinkList() {
		head = new Node();
		rear = head;
		size = 0;
	}

	private class Node {// 结点
		/*
		 * 1.数据域 2.指针域
		 */
		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() {
		// TODO Auto-generated method stub
		return size;
	}

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

	@Override
	public void add(int index, E e) {
		// TODO Auto-generated method stub
		/*
		 * 头插 尾插 中间插
		 */
		// 头插
		if(index<0||index>size) {
			throw new IllegalArgumentException("下标有误!");
		}
		Node p = new Node(e);
		if (index == 0) {// 头
			p.next = head.next;
			head.next = p;
			if (size == 0) {
				rear =p;
			}
		} else if (index == size) {// 尾
			p.next = rear.next;
			rear.next = p;
			rear = p;
		} else {// 中间
			Node flag = head;// 游标,为了找到要插入的元素的前一个位置
			int j = 0;
			while (j < index) {
				flag = flag.next;
				j++;
			}
			p.next = flag.next;
			flag.next = p;
			flag = null;// 释放这个游标,类似与C中的free函数
		}
		size++;
	}

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

	@Override
	public void addLast(E e) {
		// TODO Auto-generated method stub
		add(size, e);
	}

	@Override
	public E get(int index) {
		/*
		 * 1.查表头 2.查表中间 3.查表尾
		 */
		// TODO Auto-generated method stub
		if (index < 0 || index > size - 1 || size == 0) {
			throw new IllegalArgumentException("下标越界或者为空链表");
		}
		if (index == 0) {// 头查
			return head.next.data;
		} else if (index == size - 1) {// 尾查
			return rear.data;
		} else {// 中查
			int j = 0;
			Node p = head;
			while (j <= index) {
				p = p.next;
				++j;
			}
			return p.data;
		}
	}

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

	@Override
	public E getLast() {
		// TODO Auto-generated method stub
		return get(size - 1);
	}

	@Override
	public void set(int index, E e) {
		// TODO Auto-generated method stub
		if (index < 0 || index > size - 1) {
			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) {
		// TODO Auto-generated method stub
		return find(e) != -1;
	}

	@Override
	public int find(E e) {
		// TODO Auto-generated method stub
		if(isEmpty()) {
			return -1;
		}
		Node p = head;
		int index = -1;
		while (p.next != null) {
			index++;
			p = p.next;
			if (p.data.equals(e)) {
				return index;
			}
		}
		return -1;
	}

	@Override
	public E remove(int index) {
		// TODO Auto-generated method stub
		/*
		 * 头删 尾删 中间任意删
		 */
		// 头删
		E data = null;
		if (index == 0) {
			Node p = head.next;
			data=p.data;
			head.next=p.next;
			p=null;
			if(size==1) {//删最后一个元素,要重置尾指针
				rear=head;
			}
		}else if(index==size-1) {//尾删
			Node p=head;
			for(int i=0;i<index;i++) {
				p=p.next;				
			}
			data=p.next.data;
			p.next=rear.next;
			rear=p;
		}else {
			Node p=head;
			for(int i=0;i<index;i++) {
				p=p.next;
			}
			data=p.next.data;
			Node flag=p.next;
			p.next=flag.next;
			flag=null;
		}
		size--;
		return data;
	}

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

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

	@Override
	public void removeElement(E e) {
		// TODO Auto-generated method stub
		int index=find(e);
		if(index!=-1) {
			remove(index);
		}
	}

	@Override
	public void clear() {
		// TODO Auto-generated method stub
		head=null;
		rear=head;
		size=0;
	}

	@Override
	public String toString() {
		if(isEmpty()) {
			return "[]";
		}
		StringBuilder str=new StringBuilder("[");
		Node p=head;
		while(true) {
			p=p.next;
			if(p==rear) {
				str.append(p.data+"]");
				break;
			}else {
				str.append(p.data+",");
			}
		}
		return str.toString();
	}
}

测试单链表

package p02.动态链表;

public class TestSgLL {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		SingleLinkList<Integer> s=new SingleLinkList<Integer>();
		System.out.println(s);
		s.addFirst(100);
		s.addFirst(200);
		s.addFirst(300);
		s.addLast(26545);
		s.add(1, 1100);
		System.out.println(s.find(26545));
		System.out.println(s.find(456465465));
		System.out.println(s);
		System.out.println(s.getSize());
		System.out.println(s.isEmpty());
		System.out.println(s.get(2));
		System.out.println(s.getLast());
		System.out.println(s.getFirst());
		System.out.println(s.removeFirst());
		System.out.println(s);
		System.out.println(s.removeLast());
		System.out.println(s);
		System.out.println(s.getSize());
		s.add(3, 66);
		System.out.println(s);
		System.out.println(s.remove(1));
		System.out.println(s);
		//System.out.println(s.remove(index));
	}

}

测试结果

[]
4
-1
[300,1100,200,100,26545]
5
false
200
26545
300
300
[1100,200,100,26545]
26545
[1100,200,100]
3
[1100,200,100,66]
200
[1100,100,66]

猜你喜欢

转载自blog.csdn.net/qq_42405666/article/details/88857691