链表节点:
public class LinkNode {
public int id;
public String name;
public LinkNode next;
public LinkNode prev;
public LinkNode(int id, String name) {
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "LinkNode{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
链表实现:
/**
* 双向链表
*
* @author liyang
*/
public class DoubleLinkNodeList {
/**
* 头节点
*/
private LinkNode header;
/**
* 双向链表构造
*
* @param header
*/
public DoubleLinkNodeList(LinkNode header) {
this.header = header;
}
/**
* 获得头节点
* @return
*/
public LinkNode getHeader() {
return this.header;
}
/**
* 增加一个节点 直接放在最后 不排序
*
* @param linkNode
*/
public void add(LinkNode linkNode) {
//一个临时节点用于遍历 不能直接使用头节点 头节点不能动 它是操作这个链表的入口
LinkNode temp = header;
//找到最后一节点
while (temp.next != null) {
temp = temp.next;
linkNode.prev = temp;
}
//接在最后
temp.next = linkNode;
linkNode.prev = temp;
}
/**
* 增加一个节点 并根据节点id正序排序插入
*/
public void addById(LinkNode linkNode) {
LinkNode temp = header;
//遍历链表
while (temp.next != null) {
//判断此位置是否合适 如果temp.next.id大于要插入的 执行插入
if (temp.next.id > linkNode.id) {
temp.next.prev = linkNode;
linkNode.next = temp.next;
temp.next = linkNode;
linkNode.prev = temp;
//插入成功 退出此方法
return;
} else if (temp.id == linkNode.id) {
//id已存在 报错
throw new RuntimeException("id " + linkNode.id + " 已存在");
} else {
//此位置不合适 后移
temp = temp.next;
}
}
//遍历到最后没找到合适位置 则接在最后面
temp.next = linkNode;
linkNode.prev = temp;
}
/**
* 修改 按id为准 修改其他属性
*
* @param linkNode 修改节点
*/
public void update(LinkNode linkNode) {
if (header.next == null) {
throw new RuntimeException("链表为空");
}
//一个临时节点用于遍历 不能直接使用头节点 头节点不能动 它是操作这个链表的入口
LinkNode temp = header.next;
//遍历
while (temp != null) {
//找到后修改
if (temp.id == linkNode.id) {
temp.name = linkNode.name;
return;
}
//后移
temp = temp.next;
}
throw new RuntimeException("无此节点,修改失败。");
}
/**
* 删除 按id为准
*
* @param linkNode 节点
*/
public void delete(LinkNode linkNode) {
if (header.next == null) {
throw new RuntimeException("链表为空");
}
LinkNode temp = header.next;
//遍历链表
while (temp!= null) {
//判断temp.next是否是要删除的节点
if (temp.id == linkNode.id) {
temp.prev.next = temp.next;
//有可能出现temp(要删除的节点)是最后一个节点的情况 此时要判断
if(temp.next!=null){
//如果不是最后一个节点 再执行改变后一个节点向前指针的操作
temp.next.prev =temp.prev;
}
//删除成功 退出此方法
return;
} else {
//不是要删除的节点 后移
temp = temp.next;
}
}
//遍历到到末尾 则说明没找到要删除的节点
throw new RuntimeException("删除失败,无此节点");
}
/**
* 展示链表
*/
public void show() {
//一个临时节点用于遍历 不能直接使用头节点 头节点不能动 它是操作这个链表的入口
LinkNode temp = header.next;
if (header.next == null) {
throw new RuntimeException("链表为空");
}
//遍历
while (temp != null) {
//打印
System.out.println(temp);
//后移
temp = temp.next;
}
}
}