Java实现双向链表,实现链表的基本操作

用Java定义一个双向链表,实现链表的基本操作: 初始化、获取头结点、添加新元素、删除链表元素、 获取链表元素、查找链表元素、更新链表中某个元素、 判断链表是否为空、求链表元素个数、输出链表元素、清空链表。

逻辑思维图
在这里插入图片描述
先上结果图
在这里插入图片描述

操作结果为上图

		//初始化
		DoublyLinkedList<Integer> doublyLinkedList = new DoublyLinkedList<Integer>();
		//插入头节点
		doublyLinkedList.insertFirst(1);
		//插入尾节点
		doublyLinkedList.insertLast(3);
		doublyLinkedList.print();
		//在1后面插入2
		doublyLinkedList.insertAfter(1, 2);
		doublyLinkedList.print();
		//在3后面插入4
		doublyLinkedList.insertAfter(3, 4);
		//在4后面插入5
		doublyLinkedList.insertAfter(4, 5);
		doublyLinkedList.print();
		
		//获取指定位置的数据
		System.out.println("第3个元素的数据为:"+doublyLinkedList.getElement(3).data);
		//判断元素1是否存在
		System.out.println("元素1是否存在:"+doublyLinkedList.isContain(1));
		//将第5个位置的元素替换成55
		doublyLinkedList.modify(55,5);
		doublyLinkedList.print();
		//删除头节点
		doublyLinkedList.deleteFirst();
		doublyLinkedList.print();
		//删除尾节点
		doublyLinkedList.deleteLast();
		doublyLinkedList.print();
		//删除指定节点
		doublyLinkedList.delete(3);
		doublyLinkedList.print();
		//清空链表
		doublyLinkedList.clear();
		doublyLinkedList.print();

Node.java

class Node<T>{
	private T data;
    private Node<T> next=null;
    private Node<T> pre=null; 
    public Node(T data) {
		this.data=data;
	}
}

添加头新元素

public void insertFirst(T obj){
		Node<T> node = new Node<T>(obj);
		node.data=obj;
		if(first==null){
			last=node;
		}else{
			node.next=first;
			first.pre=node;
		}
		first=node;
		size++;
	}

添加尾新元素

public void insertLast(T obj){
		Node<T> node = new Node<T>(obj);
		if(first==null){
			first=node;
		}else{
			last.next=node;
			node.pre=last;
		}
		last=node;
		size++;
	}

在指定节点后面插入新节点

public boolean insertAfter(T target,T obj){
		Node<T> node = new Node<T>(obj);
		Node<T> temp = first;
		while(temp != null){
			if(temp.data.equals(target)){
				node.next = temp.next;
				node.pre = temp;
				if(temp == last)
					last = node;
				else
					temp.next.pre = node;
				temp.next = node;
				size++;
				return true;
			}
			temp = temp.next;
		}
		
		return false;
	}

删除头节点

public Node<T> deleteFirst() throws Exception{
		if(first == null)
			throw new Exception("empty!");
		Node<T> temp = first;
		if(first.next == null){
			first = null;
			last = null;
		}else{
			first.next.pre = null;
			first = first.next;
		}
		size--;
		return temp;
	}

删除尾节点

public Node<T> deleteLast() throws Exception{
		if(first == null)
			throw new Exception("empty!");
		Node<T> temp = last;
		if(first.next == null){
			first = null;
			last = null;
		}else{
			last.pre.next = null;
			last = last.pre;
		}
		size--;
		return temp;
	}

删除指定节点

public void delete(T obj) throws Exception{
		//检查链表是否为空
		if(isEmpty())
			throw new Exception("empty!");
		Node<T> temp = first;
		while (temp != null) {
			if (temp.data.equals(obj)) {
				if (temp == last)
					last = temp.pre;
				else
					temp.next.pre = temp.pre;
				if (temp == first)
					first = temp.next;
				else
					temp.pre.next = temp.next;
			}
			temp = temp.next;
		}
		size--;
	}

获取链表的第index个位置的元素

public Node<T> getElement(int index){
		if(index<=0 || index>size()){
            System.out.println("获取链表的位置有误!返回null,显示当前链表信息");
            return first;
        }else{
        	// 当索引的值小于该链表长度的一半时,那么从链表的头结点开始向后找是最快的
        	if(index<size/2){
        		Node<T> temp = first;
        		for(int i=1;i<index;i++){
        		      temp = temp.next;
        		}
        	    return temp;
        	}else{
        		//当索引值位于链表的后半段时,则从链表的另端开始找是最快的
            	Node<T> temp = last;
            	int newIndex = size - (index-1);
            	for(int i=1;i<newIndex;i++){
            	     temp = temp.pre;
                }
            	return temp;
        	}
        	
        }
		
	}

查找链表元素

public Boolean isContain(T obj){
    	Node<T> temp = first;
		for(int i=1;i<size();i++){
			if(temp.data.equals(obj)){
				return true;
			}
			temp = temp.next;
		}
	    return false;
    }

更新链表中某个元素

public boolean modify(T obj,int pos){
		if(isEmpty()){
			System.out.println("链表为空");
			return false;
		}else{
			if(pos<1 || pos>size()){
				System.out.println("pos值不合法");
				return false;
			}
			int num =1;
			Node<T> temp = first;
			while (num<pos) {
				temp =temp.next;
				num++;
			}
			temp.data = obj;
			return true;
		}
    }

判断链表是否为空

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

求链表元素个数

public int size(){
        return size;
    }

打印链表

public void print(){
		System.out.print("first -> last : ");
		Node<T> node = first;
		while(node != null){
			System.out.print(node.data.toString() + " -> ");
			node = node.next;
		}
		System.out.print("\n");
	}

清空链表

public void clear(){
    	first=null;
    	last=first;
	}

有空的动动小手支持一下作者!,给作者点赞加收藏,如果有问题请在底下留言!

群名称:Java技术交流2群, QQ群号:717649447

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kwnda。。。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值