您的位置:首页 > 理论基础 > 数据结构算法

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

2018-03-08 21:37 169 查看
之前学习了单向链表,没写到单向循环链表,这里简单学习记录一下,单向非循环链表的尾节点元素的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;
}基本操作就这么些吧,我得去洗个衣服,有问题的话明天我再补一下~~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息