单向环形链表就是将单向链表的最后一个节点的next指向第一个节点,从而构成一个环状链表
如何构建一个单项环形链表?
1.先创建一个first节点(
这个节点作为一个头部标识
),再创建第一个元素节点,让first指向该节点,并使该节点的next指向first形成一个环。
2.后面每遍历一个新的节点,就将原链表的最后一个元素节点的next指向新节点,而新节点的next指向first。
首先需要创建一个节点类:
//创建一个节点类,每一个节点对象就是一个节点
class CircleNode{
private int no; //编号
private CircleNode next; //指向下一个节点
public CircleNode(int no){
this.no = no;
}
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
public CircleNode getNext() {
return next;
}
public void setNext(CircleNode next) {
this.next = next;
}
}
创建一个环形链表类:
//创建一个环形的单向链表
class CircleSingleLinkedList{
//创建第一个节点,
private CircleNode first = new CircleNode(-1);
}
添加节点:
添加节点注意区分情况,要判断添加的是否是链表的第一个节点,如果是第一个节点,就需要自身构成环状。
//添加节点的方法
public void add(CircleNode node){
CircleNode cur = first; //辅助节点,方便我们遍历环形链表
//第一个节点要自身形成环状
if (first.getNext() == null){ //为true说明该链表没有节点
first = node; //使first指向第一个节点
first.setNext(first); //构成环
return;
}
//后面每创建一个新的节点,就把该节点加到已有的环型链表中即可
while (true) {
//如果这个节点的下一个节点为first,说明这是最后一个节点,我们就在环形链表尾部添加一个节点
if (cur.getNext() == first) {
cur.setNext(node); //将最后这个节点指向新插入进来的节点
node.setNext(first); //将新节点的next指向first
break;
}
cur = cur.getNext();
}
}
遍历节点:
//遍历环形链表
public void getList(){
if (first.getNext() == null){
System.out.println("链表空!");
return;
}
CircleNode cur = first;
while (true){
System.out.println(cur.getNo());
//如果这个节点的下一个节点为first,说明这是最后一个节点
if (cur.getNext() == first){
break;
}
cur = cur.getNext();
}
}
测试代码:
public static void main(String[] args) {
CircleSingleLinkedList list = new CircleSingleLinkedList();
for (int i = 0; i < 10; i++) {
int count = new Random().nextInt(10);
System.out.println("添加第"+(i+1)+"个值:"+count);
list.add(new CircleNode(count));
}
System.out.println("环形链表展示:");
list.getList();
}
运行结果: