* @author Eightn0 * @create 2021-03-13 19:33 * 环形链表:在列表的任意一个节点,都可以到达此列表的各个节点 * 单向的环形结构:列表的最后一个指针指向表头 * 插入:若将新节点插入在第一个节点前:则将新节点的指针指向原表头 * 将最后一个节点的指针指向新节点 * 将表头指向新节点 * 若将新节点插入在任意节点X之后:将新节点I的指针指向X节点的下一个节点 * 将X节点的指针指向I节点 * 删除:若删除第一个节点:将表头移到下一个节点 * 将最后一个节点的指针移到新表头上 * 若删除任意一个节点:找到要删除节点X的前一个节点 * 将X前一个节点的指针指向X的下一个节点 * 串联:直接改变两个指针 */ class Node{//定义结点 int data; Node next; public Node(int data){ this.data = data; this.next = null; } } public class CircleLink { public Node first;//定义表头 public Node last;//定义表尾 //根据表头是否为空 public boolean isEmpty(){ return first == null; } //打印链表 public void print(){ Node current = first; while (current != last){ System.out.println("["+current.data+"]"); current = current.next; } System.out.println("["+current.data+"]"); System.out.println(); } /*插入节点*/ public void insert(Node trp){ Node tmp; Node newNode; if (this.isEmpty()){//在第一个节点插入的情形 first = trp; last = trp; last.next = first; }else if (trp.next == null){//在最后一个节点插入 last.next = trp; last = trp; last.next = first; } //插入过程 { newNode = first; tmp = first; while (newNode.next != trp.next){ if (tmp.next == first) break; tmp = newNode; newNode = newNode.next; } tmp.next = trp; trp.next = newNode; } } /*删除节点*/ public void delete(Node delNode){ Node newNode; Node tmp; if (isEmpty()){ System.out.println("环形列表已经空了"); return; } if (first.data == delNode.data){//删除表头 first = first.next; if (first == null){ System.out.println("环形列表已经空了"); return; } }else if (last.data == delNode.data){//删除表尾 newNode = first; while (newNode.next != last){ newNode = newNode.next; } newNode.next = last.next; last = newNode; last.next = first; }else{ newNode = first; tmp = first; while (newNode.data == delNode.data){//找到要删除节点的坐标 tmp = newNode; newNode = newNode.next;//新链表环环相扣 } tmp.next = delNode.next;//指向要删除坐标的下一个节点 } } }
单向环形链表
最新推荐文章于 2021-03-31 20:05:31 发布