Java实现数据结构之双链表(查找,修改,插入,删除)结点

本文详细介绍了双链表的实现原理,包括其与单链表的区别,以及如何通过前后指针进行双向遍历。提供了双链表的Java代码实现,涵盖了插入、删除、搜索和更改元素的操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

双链表的实现原理与单链表的基本一致,不同之处只是在于双链表的结点增加了一个前驱指针域,用来指向它的前驱结点,可以实现链表的双向遍历,在插入和删除结点是也更方便

可以参考单链表来看https://blog.youkuaiyun.com/qq_34517044/article/details/102817627

package Datastruct;
class DoubleLinkList<Item>{
	private class Node{
		Item item;
		Node prenext;
		Node latnext;
	}
    private Node first;
    private Node last;
    private int N;
    public boolean isEmpty() {
    	return first==null;
    }
    public int size() {
    	return N;
    }
    public void put(Item item) {
    	Node oldlast=last;
    	last=new Node();
    	last.item=item;
    	if(isEmpty()) first=last;
    	else {
    		oldlast.latnext=last;
    		last.prenext=oldlast;
    	}
    	N++;
    }
    public void search(int i) {
    	if(isEmpty()) {
    		System.out.println("List is Empty,Search fail");
    		return; 
    	}
    	if(i<1||i>N) {
    		System.out.println("Search Exceed");
    		return;
    	}
    	else {
    		Node x=first;
    		int count=0;
    		for(;x!=null;x=x.latnext) {
    			count++;
    			if(i==count) break;
    		}
    		System.out.println(x.item);
    	}
    }
    public void change(int i,Item item) {
    	if(isEmpty()) {
    		System.out.println("List is Empty,Change fail");
    		return;
    	}
    	if(i<1||i>N) {
    		System.out.println("Change Exceed");
    		return;
    	}
    	else {
    		Node x=first;
    		int count=0;
    		for(;x!=null;x=x.latnext) {
    			count++;
    			if(count==i) break;
    		}
    		x.item=item;
    	}
    }
    public void insert(Item item,int i) {
    	if(i==1) {
    		Node oldfirst=first;
    		first=new Node();
    		first.item=item;
    		first.latnext=oldfirst;
    		oldfirst.prenext=first;
    	}
    	else {
    		Node x=first;
    		int count=0;
    		for(;x!=null;x=x.latnext) {
    			count++;
    			if(i==count) break;
    		}
    		Node n=new Node();
    		n.item=item;
    		n.prenext=x.prenext;
    		n.latnext=x;
    		x.prenext.latnext=n;
    		x.prenext=n;
    	}
    	N++;
    }
    public void delete(int i) {
    	if(isEmpty()) {
    		System.out.println("List is Empty,delete fail");
    		return;
    	}
    	if(i==1) {
    		first=first.latnext;
    		first.prenext=null;
    	}
    	else if(i==N) {
    		Node x=first;
    		int count=0;
    		for(;x!=null;x=x.latnext) {
    			count++;
    			if(count==i) break;
    		}
    		x.prenext.latnext=null;
    		last=x.prenext;
    	}
    	else {
    		Node x=first;
    		int count=0;
    		for(;x!=null;x=x.latnext) {
    			count++;
    			if(i==count) break;
    		}
    	    x.prenext.latnext=x.latnext;
    	    x.latnext.prenext=x.prenext;
    	}
    	N--;
    }
    public void show() {
    	if(isEmpty()) {
    		System.out.println("链表为空");
    		return;
    	}
    	else {
    		Node x=first;
    		for(;x!=null;x=x.latnext) {
    			System.out.print(x.item+" ");
    		}
    		System.out.println();
    	}
    }
}
public class DoubleLinkListTest {
	public static void main(String[] args) {
		DoubleLinkList<Integer> l=new DoubleLinkList<Integer>();
		l.put(1);
		l.put(3);
		l.put(2);
		l.put(5);
		l.change(3,7);
		l.show();
		System.out.println("链表大小:"+l.size());
		l.insert(8,2);
		l.show();
		l.delete(2);
		l.show();
	}
}

因为用的是泛型,测试时可以任意指定基本对象类型 

测试结果是对的,可以自行测试 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值