/** * @author Eightn0 * @create 2021-03-13 20:36 * 双向链表:一个字段存放数据,两个字段存放指针,一个指针指向后面的节点,另一个指针指向前面的节点 * llink-data-rlink * 插入:在第一个位置插入:将新节点的右链接指向原表的第一个节点,左链接指向null * 将原表第一个节点的左链接指向新节点 * 将原表表头指针head指向新节点 * 在最后一个位置插入:将原表的最后一个节点的右链接指向新节点 * 将新节点的左链接指向原表的最后一个节点,右链接指向null * 在中间位置插入:记新节点左边为ptr,又被为rtr * ptr右链接指向新节点 * 新节点左链接指向ptr,右链接指向rtr * rtr左链接指向新节点 * 删除:删除第一个节点:表头指针head指向下一个 * 新表头指针指向null * 删除最后一个节点:倒数第二个节点的右指针指向null * 删除中间节点:上一个节点的右链接指向下一个 * 下一个节点的左链接指向上一个 */ class Node{ int data; Node rnext; Node lnext; public Node(int data) { this.data = data; this.rnext = null; //每个节点都有左指针、右指针,默认为null,后面再赋值 this.lnext = null; } } public class Doubly { private Node first; private Node last; public boolean isEmpty(){ return first == null; } public void print(){ Node current = first; while (current != null){ System.out.println("["+current.data+"]"); current = current.rnext; } System.out.println(); } /*插入节点*/ public void insert(Node newN){ Node tmp; Node newNode; if (isEmpty()){ first = newN; first.rnext = last; last = newN; last.lnext = first; }else { if (newN.lnext == null){//插入表头 first.lnext = newN;//原表头左链接指向新节点 newN.rnext = first;//新节点右指针指向原表头 first = newN;//表头移向新指针,顺序不能乱 }else { if (newN.rnext == null){//插入表尾 last.rnext = newN;//表尾的右链接指向新节点 newN.lnext = last;//新节点左链接指向原表尾 last = newN; //新表尾指向新节点 }else {//插入中间 newNode = first; tmp = first; while (newN.rnext != newNode.rnext){ tmp = newNode; newNode = newNode.rnext;//搜索过程 } tmp.rnext = newN;//插入过程 newN.rnext = newNode; newNode.lnext = newN; newN.lnext = tmp; } } } } /*删除节点*/ public void delete(Node delNode){ Node newNode; Node tmp; if (first == null){//判断链表是否为空 System.out.println("[表是空的]"); return; } if (delNode == null){//判断删除条件是否存在 System.out.println("[错误:del不是表中的节点]"); return; } if (first.data == delNode.data){//删除表头 first = first.rnext;//开始移向第二个节点 first.lnext = null;//将第二个节点的左链接设置为null }else if (last.data == delNode.data){//删除表尾 newNode = first; while (newNode.rnext != last) newNode = newNode.rnext; newNode.rnext = null; last = newNode; }else {//删除表的中间位置的节点 newNode = first; tmp = first; while (newNode.data != delNode.data){ tmp = newNode;//查找过程 newNode = newNode.rnext; } tmp.rnext = delNode.rnext;//删除过程 tmp.lnext = delNode.lnext; } } }
双向链表的添加元素与删除元素
最新推荐文章于 2023-10-14 19:40:09 发布