数据结构之链表

    数据结构中有链表、栈、队列、排序、数组、树。下面学习单链表。

单链表概念

    链表是最基本的数据结构,以head为头节点,头结点并不存放任何数据,它是链表的开始,指向链表中第一个节点,而每个节点都有一个next的向下引用,指向下一个节点,直到最后一个节点。每一个节点由两部分组成,包括data(存放数据),next(指向下一个节点),下面是单链表的基本形式。


    单链表用java定义如一下代码。

class Node{
		int data;//数据
		Node next=null;//节点的引用,指向下一个节点
		public Node(int data){
			this.data=data;
		}
	}

    对于链表的增加或者删除一个节点相对于顺序表来说则是比较高效的,链表只需要改变节点之间的引用关系,而顺序表还需要移动元素,如果不理想的话,甚至要移动所有数据,这也就造成了顺序表和链表之间对于增删效率的差异,下面用java实现以下单链表增加节点和删除节点的情况。

单链表增加节点

    

    上图也就简单的说明了在中间插入一个节点,只需要改变节点之间的引用关系即可。下面贴出用java实现的增加节点的代码。

//向链表末尾添加节点
	public void addNode(int data){
		Node node=new Node(data);
		if(head==null){
			head=node;
			return;
		}
		Node temp=head;
		while(temp.next!=null){
			temp=temp.next;
		}
		temp.next=node;
	}
	//向固定位置添加节点
	public void addNode(int index,int data){
		Node node=new Node(data);
		if(index<1||index>length()-1)
			return;
		Node temp=head;
		int i=0;
		while(temp.next!=null){
			//遍历到目标节点时,前一个节点为temp   当前节点为temp.next    后一个节点为temp.next.next
			if(index==i++){
				node.next=temp.next.next;//将目标节点的引用指向,后一个节点
				temp.next=node;//将前一个节点的应用指向node
			}
			temp=temp.next;
		}
  • }

单链表删除节点

    

//删除节点
	public void deleteNode(int index){
		if(index<1||index>length()-1){
			return;
		}
		if(head==null)
			return;
		Node temp=head;
		int length=1;
		while(temp.next!=null){
			//当前节点为temp.next  前一个节点为temp  后一个节点为temp.next.next
			if(index==length++){
				temp.next=temp.next.next;
				return;
			}
			temp=temp.next;
		}
		
		
	}

    以上也只是自己对单链表的增加和删除链表节点简单总结。

双链表的概念

    双链表是每个节点有两个地址的线性表链表,两个地址分别指向前驱节点和后继节点。下面贴出双链表的部分结构。


    用java实现双链表的代码如下。

class DoubleNode{
	int data;//存放数据
	DoubleNode pre,next;//节点的前驱,后继节点
	public DoubleNode(int data, DoubleNode pre, DoubleNode next) {
		super();
		this.data = data;
		this.pre = pre;
		this.next = next;
	}
	
	
}

双链表增加节点

public void addNode(int n,int data){
		DoubleNode temp=head;
		int length=0;
		while(temp.next!=null){
			//当前节点为temp.next  前驱节点为temp     后继节点temp.next.next
			if(n==length++){
				DoubleNode node=new DoubleNode(1,temp,temp.next);
				temp.next=node;//前驱节点的后继节点为node,
				temp.next.pre=node;//插入节点的后继节点的前驱为node
			}
			temp=temp.next;
		}
	}

    

    双链表删除节点

        

public void deleteNode(int n){
		DoubleNode temp=head;
		int length=0;
		while(temp.next!=null){
			//当前节点为temp.next  前驱节点为temp     后继节点temp.next.next
			if(n==length++){
				temp.next=temp.next.next;
				temp.next.next.pre=temp;
			}
			temp=temp.next;
		}
	}

    通过以上分析,我们知道双链表在单链表的结构上增加了前驱节点,这使得双链表可以在两个方向遍历,访问前驱节点和后继节点。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值