数据结构-双向链表(一)(java)

之前学习了单向链表,没写到单向循环链表,这里简单学习记录一下,单向非循环链表的尾节点元素的next指向的是null,也就是没有后继节点,并且头节点没有前驱元素,就是一条链子,首尾不相连。

而单向循环链表就是头节点的前驱元素就是尾节点,尾节点的后继元素是头节点,next就不是null了。循环链表就是首尾相连的链子。

现在学习一下双向链表的实现(非循环)

双向链表的每个元素都有一个关键字和两个指针prev+next,假设x是双向链表的一个元素,x.prev指向x的前驱元素,x.next指向x的后继元素。如果x.prev为null,说明x没有前驱元素,则x就是链表 的头元素。如果x.next为null,说明x没有后继元素,则x就是链表的尾元素。链表的属性head为null,说明链表为空。

双向链表的实现其实也很简单,比单向链表多了一个往前指的指针,单向链表的实现可以看我之前的博客~

1 写一个节点:

package com.yushen.linkedlist;


/**
 * 单向链表
 * 
 * @author yushen
 * 
 */
public class Node {


	public Node prev;//指向前驱节点的指针
	public Node next;//指向后继节点的指针
	public int data;


	public Node(int data) {
		this.data = data;
		this.next = null;
		this.prev = null;
	}
}

双向链表的节点是这样


2 这样的话向链表中加入元素:


代码实现:

/**
	 * 对链表进行添加元素
	 */
	public void add(int data) {
		// 创建节点
		Node newNode = new Node(data);

		if (null == head) {
			// 如果头节点为空,则当前的节点为头节点
			head = newNode;
			return;
		}

		// 当前头节点不为空,则将要添加的节点放到最前
		newNode.next = head;
		head.prev = newNode;
	}

3 删除一个链表的节点:


代码实现:

/**
	 * 删除链表元素
	 * 
	 * @param data
	 */
	public void delete(Node tempNode) {
		// 如果头节点就是要删除的元素,head的前驱元素为null
		if (head.data == tempNode.data) {
			head = head.next;
			head.prev = null;
			return;
		}
		while (null != tempNode.prev && tempNode.next != null) {
			tempNode.next.prev = tempNode.prev;
			tempNode.prev.next = tempNode.next;
			
		}
	}

4 获取链表长度代码实现:

/**
	 * 返回链表的长度
	 * 
	 * @return
	 */
	public int getLength() {
		int length = 0;
		Node node = head;
		while (null != node) {
			length++;
			node = node.next;
		}
		return length;
	}

5 返回指定位置的元素:

/**
	 * 返回指定位置的元素
	 * 
	 * @param linkedList
	 * @param index
	 * @return
	 */
	public Node get(int index) {
		Node node = head;
		int length = 0;
		while (null != node && length != index) {
			length++;
			node = node.next;
		}
		return node;
	}
基本操作就这么些吧,我得去洗个衣服,有问题的话明天我再补一下~~~


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值