java手动实现LinkedList 双向链表的相关操作

package cn.java.mhz;


/**
 *	双向链表
 * 	手动实现LinkedList
 *        增加删除效率高,但是查询效率低
 *  	 增加泛型
 *  remove移除操作
 * @author asus
 *
 */

class Node{
	/*上一个节点  下一个节点  此节点元素数据*/
	
	private Node previous;
	private Node next;
	private Object element;
	
	//构造器重载
	public Node(Node previous, Node next, Object element) {
		super();
		this.previous = previous;
		this.next = next;
		this.element = element;
	}
	
	public Node(Object element)
	{
		this.element = element;
	}
	
	public Node(Node previous , Object element)
	{
		this.previous = previous;
		this.element = element;
	}
	
	public Node()
	{
		
	}
	//set get方法
	public Node getPrevious() {
		return previous;
	}
	public void setPrevious(Node previous) {
		this.previous = previous;
	}
	public Node getNext() {
		return next;
	}
	public void setNext(Node next) {
		this.next = next;
	}
	public Object getElement() {
		return element;
	}
	public void setElement(Object element) {
		this.element = element;
	}
	
}

public class MyLinkedList<E> {
	
	private Node first;
	private Node last;
	private int size=0;
	//检查是否越界
	private void checkIndex(int index)
	{
		int k = this.length();
		if(index>k-1||index<0) {
			throw new RuntimeException("\nIndex不合法 "+index+"\nnow length is "+k);
		}
	}
	//length方法
	public int length()
	{
		int solve=0;
		for(Node k=first;k!=last;k=k.getNext()) {
			solve++;
		}
		solve+=1;
		return solve;
	}
	//set方法
	public void set(E element,int index)
	{
		checkIndex(index);
		Node solve = new Node();
		solve =first;
		int k=0;
		for(;k<index;solve=solve.getNext(),k++);
		solve.setElement(element);
	}
	//向链表中插入元素     [0,length-1]
	public void add(int index,E element)
	{
		checkIndex(index);
		Node P2 = new Node(element);
		Node solve = new Node();
		solve = first;
		int k = 0;
		for(;k<index;solve=solve.getNext(),k++);
		Node P = solve.getPrevious();
		Node P1 = solve.getNext();
		if(index==0||index==size-1) {
			if(index==0) {
				solve.setPrevious(P2);
				P2.setNext(solve);
				first=P2;
				size++;
			}
			else {
				this.append(element);
			}
		}
		else {
			P.setNext(P2);
			P2.setPrevious(P);
			solve.setPrevious(P2);
			P2.setNext(solve);
			size++;
		}
	}
	//从链表中删除元素
	public void remove(int index)
	{
		checkIndex(index);
		Node solve = new Node();
		solve = first;
		int k = 0;
		for(;k<index;solve=solve.getNext(),k++);
		Node P = solve.getPrevious();
		Node P1 = solve.getNext();
		if(P!=null) {
			P.setNext(P1);
		}
		if(P1!=null) {
			P1.setPrevious(P);
		}
		if(index==0) {
			first=P1;
		}
		if(index==size-1)
		{
			last=P;
		}
		size--;
	}
	//get方法
	public E get(int index)
	{
		checkIndex(index);
		Node solve = new Node();
		int k=1;
		for(Node i =first; k<=index+1; i=i.getNext(),k++)
		{
			solve = i;
		}
		return (E)solve.getElement();
	}
	//检查链表是否包含某元素
	public boolean contain(Object element)
	{
		Node solve = new Node();
		solve = first;
		for(;solve!=last;solve=solve.getNext())
			if(solve.getElement().equals(element)) return true;
		if(last.getElement().equals(element)) return true;
		return false;
	}
	//向双向连表中向后添加元素
	public void append(E obj)
	{
		Node node = new Node(obj);
		if(first == null) {
			node.setPrevious(first);
			node.setNext(last);
			first = node;
			last = node;
			
		}
		else {
			node.setPrevious(last);
			node.setNext(null);
			last.setNext(node);
			last=node;
		}
		size++;
	}
	
	//重写toString方法
	@Override
	public String toString()
	{
		StringBuilder sb = new StringBuilder();
		
		sb.append("[");
		for(Node i = first ; i!=last; i=i.getNext())
		{
			sb.append(i.getElement()+",");
		}
		sb.append(last.getElement());
		sb.append("]");
		
		return sb.toString();
	}
	
	//main方法
	public static void main(String[] args)
	{
		MyLinkedList <String> list = new MyLinkedList<String>();
		list.append("mhz");
		list.append("wzl");
		list.append("yxk");
		list.append("mhz");
		list.append("wzl");
		list.append("yxk");
		System.out.println(list.toString());
		System.out.println(list.get(2));
		System.out.println(list.length());
		list.remove(2);
		System.out.println(list.toString());
		System.out.println(list.length());
		list.set("shit", 2);
		System.out.println(list.toString());
		System.out.println(list.contain("mhz"));
		System.out.println(list.contain("wzl"));
		System.out.println(list.contain("jk"));
		list.remove(0);
		System.out.println(list.toString());
		list.remove(3);
		System.out.println(list.toString());
		list.add(2, "wzl");
		System.out.println(list.toString());
		list.add(0, "mhz");
		System.out.println(list.toString());
		list.add(1, "yxk");
		System.out.println(list.toString());
		System.out.println(list.length());
	}
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值