Java实现循环链表

本案例需要完成的任务定义如下:实现一个循环链表(单链表),具备增加元素、删除元素、打印循环链表等功能。

网上许多同类问题的实现方式过于复杂、难懂,本文旨在提出一种实现循环链表的简单、易懂的方法。

 

定义链表节点:

对于每一个链表节点,关键要素是节点自身数值data以及所指向的下一个节点next。

package circularLinkedList;

public class Node {
	//元素类型为int的节点
	private int data;
	private Node next;
	//定义构造器
	public Node(int i, Node nt){
		data = i;
		next = nt;
	}
	public Node(int i){
		this(i,null);
	}
	public Node(){
		this(0,null);
	}
	//更改元素数值
	public void setData(int i){
		data = i;
	}
	//读取元素数值
	public int getData(){
		return data;
	}
	//更改元素的指向
	public void setNext(Node nt){
		next = nt;
	}
	//读取元素的指向
	public Node getNext(){
		return next;
	}
}
 

定义循环链表:

对于循环链表而言,关键要素是指定链表的头节点head、尾节点tail以及链表大小size;该数据结构支持在头部增加节点、在尾部增加节点,从头部删除节点及从尾部删除节点等。

package circularLinkedList;

public class Linkedlst {
	private Node head;
	private Node tail;
	int size;
	//构造器
	public Linkedlst(){
		tail = head = null;
		size = 0;
	}
	
	//在链表头部增加节点
	public void addHead(Node hd){
	//如果使用该方法增加链表的第一个节点,则head=tail=hd,且next指向自身。
		if(size==0){
			hd.setNext(hd);
			tail = head = hd;
			size++;
		}
		else{
				tail.setNext(hd);
				hd.setNext(head);
				head = hd;
				size++;
		}
	}
	
	//在链表尾部增加节点
	public void addTail(Node tl){
	//如果使用该方法增加链表的第一个节点,则tail=head= hd,且next指向自身。
		if(size==0){
			tl.setNext(tl);
			tail = head = tl;
			size++;
		}
		else{
			tail.setNext(tl);
			tl.setNext(head);
			tail = tl;
			size++;
		}
	}
	
	//删除头部节点,被删掉的head将被自动回收
	public void delHead(){
		if(size>1){
			head = head.getNext();
			tail.setNext(head);
			size--;
		}
		else if(size==1){
			head = tail = null;
			size--;
		}
		else{
			System.out.println("There is no elements in the linked list.");
		}
	}
	
	//删除尾部节点
	public void delTail(){
		if(size>1){
			Node nd = new Node();
			nd = head;
			while(nd.getNext()!=tail){
				nd = nd.getNext();
			}
			nd.setNext(head);
			size--;
		}
		else if(size==1){
			head = tail = null;
			size--;
		}
		else{
			System.out.println("There is no elements in the linked list.");
		}		
	}
	
	//打印全部节点
	public void printList(){
		Node nd = new Node();
		nd = head;
		try{
			while(nd.getNext()!=head){
				System.out.print(nd.getData());
				System.out.print("->");
				nd = nd.getNext();
			}		
			System.out.print(nd.getData());
			System.out.print("->");
			System.out.print(head.getData());
		}
		catch(Exception e){			
			e.printStackTrace();
		}
		
	}
}

 

测试程序:

测试了打印循环链表元素、删除首端节点等方法,运行正常。

package circularLinkedList;

public class LinkedlstTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Linkedlst lst = new Linkedlst();
		Node head = new Node(11,null);
		lst.addHead(head);
		lst.addTail(new Node(22));
		lst.addTail(new Node(33));
		System.out.println("打印链表:");
		lst.printList();
		System.out.println();
		System.out.println("删除首端节点:");
		lst.delHead();
		lst.printList();
		System.out.println();
		System.out.println("删除首端节点:");
		lst.delHead();
		lst.printList();		
	}

}


  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值