package com.zhangwl.数据结构.双向链表;

/**
* @ClassName Node
* @Description 双向链表节点
* @Author zhangwl
* @Date 2019/11/18 22:34
* @Version 1.0
**/
@SuppressWarnings("all")
public class Node {

//节点id编号
public Integer id;
//节点数据
public String data;
//节点指针指向下一个节点
public Node next;
//节点指针指向上一个节点
public Node pre;

public Node() {
}

public Node(Integer id, String data) {
this.id = id;
this.data = data;
}

/**
* 打印具体节点信息
*
* @return
*/
@Override
public String toString() {
//这块容易导致java.lang.StackOverflowError 异常,在打印next和pre的情况下会导致该异常(无线循环)
return "Node{" +
"id=" + id +
", data='" + data +
"'}";
}
}

package com.zhangwl.数据结构.双向链表;

/**
* @ClassName DoubleLinkedList
* @Description 双向链表
* @Author zhangwl
* @Date 2019/11/18 22:40
* @Version 1.0
**/
@SuppressWarnings("all")
public class DoubleLinkedList {

//创建头节点first
Node first = new Node(0, null);

/**
* 获取头结点
*
* @return 返回头结点
*/
public Node getFirst() {
if (null != first.next) {
return first.next;
}
return null;
}

/**
* 向双向链表中添加一个节点
*
* @param node 添加到链表中的节点
* @return false :添加失败 ;true:添加成功
*/
public boolean add(Node node) {
Node temp = first;
boolean flag = false;
while (true) {
//标识遍历到最后一个节点
if (null == temp.next) {
node.pre = temp;
temp.next = node;
flag = true;
break;
}
temp = temp.next;
}
//返回是否添加成功的标识
return flag;
}

/**
* 修改双向链表中的元素
*
* @return false :修改失败;true:修改成功
*/
public boolean update(Node node) {
//是否修改成功的标志,默认修改失败
boolean flag = false;
//判断链表中是否有节点供修改
if (null == first.next) {
System.out.println("哦哦,链表,空空如也...");
}
Node temp = first.next;
//循环遍历找到链表中的元素进行修改
while (true) {
if (null != temp) {
if (temp.id == node.id) {
temp.data = node.data;
flag = true;
break;
}
temp = temp.next;
continue;
}
break;
}
if (!flag) {
System.out.println("糟糕,尚无要修改的节点");
}
return flag;
}

public boolean delete(int id) {
//是否删除成功的标志,默认修改失败
boolean flag = false;
//判断链表中是否有节点供删除
if (null == first.next) {
System.out.println("哦哦,链表,空空如也...");
}
Node temp = first.next;
//循环遍历找到链表中的元素进行删除
while (true) {
if (null != temp) {
if (temp.id == id) {
temp.pre.next = temp.next;
temp.next.pre = temp.pre;
flag = true;
break;
}
temp = temp.next;
continue;
}
break;
}
if (!flag) {
System.out.println("糟糕,尚无要删除的节点");
}
return flag;
}

/**
* 遍历双向链表,并打印
*/
public void foreach() {
//判断链表是否为空
if (first.next == null) {
System.out.println("哦哦,链表,空空如也...");
}
Node temp = first.next;
while (true) {
if (null == temp) {
break;
}
System.out.println(temp);
temp = temp.next;
}
}
}

package com.zhangwl.数据结构.双向链表;

import org.junit.Test;

/**
* @ClassName RunMain
* @Description
* @Author zhangwl
* @Date 2019/11/18 23:00
* @Version 1.0
**/
public class RunMain {

//添加节点
@Test
public void test_add_update() {
DoubleLinkedList linkedList = new DoubleLinkedList();
linkedList.add(new Node(1, "东至"));
linkedList.add(new Node(2, "青阳"));
linkedList.add(new Node(3, "石台"));
System.out.println("获取头元素:");
System.out.println(linkedList.getFirst());
System.out.println("遍历链表中元素:");
linkedList.foreach();
}

//修改节点
@Test
public void test_update() {
DoubleLinkedList linkedList = new DoubleLinkedList();
linkedList.add(new Node(1, "东至"));
linkedList.add(new Node(2, "青阳"));
linkedList.add(new Node(3, "石台"));
System.out.println("遍历链表中元素:");
linkedList.foreach();
System.out.println("修改链表中的节点:");
linkedList.update(new Node(2, "贵池"));
System.out.println("遍历链表中元素:");
linkedList.foreach();
}

//删除节点
@Test
public void test_delete() {
DoubleLinkedList linkedList = new DoubleLinkedList();
linkedList.add(new Node(1, "东至"));
linkedList.add(new Node(2, "青阳"));
linkedList.add(new Node(3, "石台"));
System.out.println("遍历链表中元素:");
linkedList.foreach();
System.out.println("删除链表中的节点:");
System.out.println(linkedList.delete(2));
System.out.println("遍历链表中元素:");
linkedList.foreach();
System.out.println("删除链表中的节点:");
System.out.println(linkedList.delete(1));
System.out.println("遍历链表中元素:");
linkedList.foreach();
}
}
posted on 2019-11-20 23:26  it_zhangwl  阅读(169)  评论(0编辑  收藏  举报