Created by sykus on 2018/1/15. / public class MyCircleLinkedList { private Node head;//头结点, 不存数据 private Node tail;//尾结点, 指向链表的最后一个节点 private int size; public MyCircleLinkedList() { head = new Node(Integer.MIN_VALUE, null); head.next = head; tail = head; size = 0; } /*
添加到链表尾部
@param item / public void add(int item) { /********* Begin / Node node = new Node(item, tail.next); tail.next = node; tail = node; ++size; /* End *******/ } /
遍历链表并输出元素 / public void output() { /********* Begin / Node p = head; while (p.next != head) { p = p.next; System.out.println(p.item); } /* End *********/ } public boolean isEmpty() { return head.next == head; } public int size() { return size; } //结点内部类 private static class Node { int item; Node next; Node(int item, Node next) { this.item = item; this.next = next; } } }
Created by sykus on 2018/1/15. / public class MyCircleLinkedList { private Node head;//头结点, 不存数据 private Node tail;//尾结点, 指向链表的最后一个节点 private int size; public MyCircleLinkedList() { head = new Node(Integer.MIN_VALUE, null); head.next = head; tail = head; size = 0; } /*
遍历链表并输出元素 / public void output() { Node p = head; while (p.next != head) { p = p.next; System.out.println(p.item); } } /*
删除从头结点开始的第index个结点
index从0开始
@param index
@return / public int remove(int index) { checkPosIndex(index); /********* Begin / Node f = head; while ((index–) > 0) { f = f.next; } Node del = f.next; if (del == tail) {//要删除的是尾结点 tail = f;//使tail依然指向末尾结点 } f.next = del.next; del.next = null; int oldVal = del.item; del = null; –size; return oldVal; /* End *******/ } public boolean isEmpty() { return head.next == head; } public int size() { return size; } private void checkPosIndex(int index) { if (index < 0 || index >= size) { throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); } } //结点内部类 private static class Node { int item; Node next; Node(int item, Node next) { this.item = item; this.next = next; } } } 第三关 双向循环链表的实现—链表的插入 package step3; /
Created by sykus on 2018/1/15. / public class MyDoubleLinkedList { private Node head;//头结点 private Node tail;//指向链表的尾结点 private int size; public MyDoubleLinkedList() { head = new Node(null, Integer.MIN_VALUE, null); head.next = head.prev = head; tail = head; size = 0; } /*
添加元素到表尾
@param item / public void add(int item) { /********* Begin / Node newNode = new Node(null, item, null); tail.next = newNode; newNode.prev = tail; newNode.next = head; head.prev = newNode; tail = newNode; ++size; /* End *******/ } /
打印双向链表
@param flag true从左向右顺序打印, false从右向左顺序打印 */ public void printList(boolean flag) { Node f = head; if (flag) {//向右 while (f.next != head) { f = f.next; System.out.print(f.item + " "); } } else {//向左 while (f.prev != head) { f = f.prev; System.out.print(f.item + " "); } } } public int size() { return size; } //结点内部类 private static class Node { int item; Node next;//直接后继引用 Node prev;//直接前驱引用 Node(Node prev, int item, Node next) { this.prev = prev; this.item = item; this.next = next; } } }
第4关:双向循环链表的实现—链表的删除 package step4; /**
Created by sykus on 2018/1/15. / public class MyDoubleLinkedList { private Node head;//头结点 private Node tail;//指向链表的尾结点 private int size; public MyDoubleLinkedList() { head = new Node(null, Integer.MIN_VALUE, null); head.next = head.prev = head; tail = head; size = 0; } /*
@return / public int remove(int index) { checkPosIndex(index);// /********* Begin / Node p = head.next; while ((index–) > 0) { p = p.next; } if (p == tail) { tail = p.prev; } p.prev.next = p.next; p.next.prev = p.prev; int val = p.item; p = null; –size; return val; /* End *******/ } /
打印双向链表
@param flag true从左向右顺序打印, false从右向左顺序打印 */ public void printList(boolean flag) { Node f = head; if (flag) {//向右 while (f.next != head) { f = f.next; System.out.print(f.item + " "); } } else {//向左 while (f.prev != head) { f = f.prev; System.out.print(f.item + " "); } } } public int size() { return size; } private void checkPosIndex(int index) { if (index < 0 || index >= size) { throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); } } //结点内部类 private static class Node { int item; Node next;//直接后继引用 Node prev;//直接前驱引用 Node(Node prev, int item, Node next) { this.prev = prev; this.item = item; this.next = next; } } }