Java实现循环链表

来源:互联网 发布:js 跨域请求 编辑:程序博客网 时间:2024/06/10 16:56

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

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

 

定义链表节点:

对于每一个链表节点,关键要素是节点自身数值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 stubLinkedlst 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();}}


0 0
原创粉丝点击