单向链表linkedSinglyList
难点在于判断角标位置何时动
还有考虑时间复杂度的排序方法,使用了选择排序
import p1.接口.List; import java.util.Comparator; import java.util.Iterator; //单向链表 public class linkedSinglyListimplements List { //定义结点对象 private class Node { E data; //数据域 Node next; //指针域 public Node() { //无参 this(null, null); } public Node(E data) {//单参数 this(data, null); } public Node(E data, Node next) { this.data = data; this.next = next; } @Override public String toString() { return data.toString(); } } private Node head; //头指针 private Node tail; //尾指针 private int size; //元素的个数 public linkedSinglyList() { head = null; tail = null; size = 0; } public linkedSinglyList(E[] arr) { if (arr == null || arr.length == 0) { throw new IllegalArgumentException("arr is null"); } for (int i = 0; i < arr.length; i++) { add(arr[i]); } } @Override public void add(E element) {//只加数据加到末尾 add(size, element); } @Override public void add(int index, E element) {//对应角标添加元素 if (index < 0 || index > size) {//判断角标是否首尾 throw new IllegalArgumentException("add index out of range超过范围"); } Node n = new Node(element); if (size == 0) {//第一个元素 head = n; tail = n; } else if (index == 0) {//头插 n.next = head; head = n; } else if (index == size) {//尾部插入 tail.next = n; tail = n; } else { Node p = head; for (int i = 0; i < index - 1; i++) { p = p.next; } n.next = p.next; p.next = n; } size++; } @Override public void remove(E element) {//单删除元素 int index = indexOf(element); if (index != -1) { remove(index); } } @Override public E remove(int index) {//删除该角标元素 if (index < 0 || index >= size) {//判是否在范围 throw new IllegalArgumentException("remove index out of range"); } E ret = null; if (size == 1) {//只有一个元素直接清空 ret = head.data; head = null; tail = null; } else if (index == 0) {//头 Node n = head; ret = n.data; head = n.next; n.next = null; } else if (index == size - 1) {//尾 Node p = head; while (p.next != tail) {//把p点往后扩一个 查是否最后一个 p = p.next; } ret = tail.data; p.next = null; tail = p; } else {//删中间 Node p = head; for (int i = 0; i < index - 1; i++) {//遍历p p = p.next; }//用n前一个连n后一个,架空n来删n Node n = p.next; ret = n.data; p.next = n.next; n.next = null; } size--; return ret; } @Override public E get(int index) {//获取当前值 if (index < 0 || index >= size) {//判范围 throw new IllegalArgumentException("get index out of range"); } if (index == 0) { return head.data;//头 } else if (index == size - 1) { return tail.data;//尾 } else { Node p = head; for (int i = 0; i < index; i++) { p = p.next; } return p.data; } } @Override public E set(int index, E element) {//同get if (index < 0 || index >= size) { throw new IllegalArgumentException("get index out of range"); } E ret = null; if (index == 0) { ret = head.data; head.data = element; } else if (index == size - 1) { ret = tail.data; tail.data = element; } else { Node p = head; for (int i = 0; i < index; i++) { p = p.next; } ret = p.data; p.data = element; } return ret; } @Override public int size() { return size; } @Override public int indexOf(E element) {//查角标位置 Node p = head; int index = 0; while (!p.data.equals(element)) {//只要不一样就下一个 p = p.next; index++; if (p == null) { return -1; } } return index; } @Override public boolean contains(E element) {//查包含 return indexOf(element) != -1; } @Override public boolean isEmpty() {//容量或头尾无元素 return size == 0 && head == null && tail == null; } @Override public void clear() {//重置 head = null; tail = null; size = 0; } @Override public void sort(Comparator c) {//排序 if (c == null) { throw new IllegalArgumentException("comparator can not be null"); } //此处的插入排序高O n^3 if (size == 0 || size == 1) {//选择排序挨个对比交换位置形成顺序 return; } Node nodeA = head; Node nodeB = nodeA.next; while (true) { while (true) { if (c.compare(nodeA.data, nodeB.data) > 0) { swap(nodeA, nodeB); } if (nodeB == tail) { break; } nodeB = nodeB.next; } if (nodeA.next == tail) { break; } nodeA = nodeA.next; nodeB = nodeA.next; } } private void swap(Node nodeA, Node nodeB) { E temp = nodeA.data; nodeA.data = nodeB.data; nodeB.data = temp; } @Override public List subList(int fromIndex, int toIndex) { //0 <= fromIndex <= toIndex <= size - 1 [fromIndex,toIndex] if (fromIndex < 0 || toIndex >= size || fromIndex > toIndex) { throw new IllegalArgumentException("must 0 <= fromIndex <= toIndex <= size - 1"); } linkedSinglyList list = new linkedSinglyList<>(); Node nodeA = head; for (int i = 0; i < fromIndex; i++) { nodeA = nodeA.next; } Node nodeB = head; for (int i = 0; i < toIndex; i++) { nodeB = nodeB.next; } Node p = nodeA; while (true) { list.add(p.data); if (p == nodeB) { break; } p = p.next; } return list; } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append('['); if (isEmpty()) { sb.append(']'); } else { Node p = head; while (true) { sb.append(p.data); if (p == tail) { sb.append(']'); break; } sb.append(','); sb.append(' '); p = p.next; } } return sb.toString(); } @Override public Iterator iterator() { return new linkedSinglyListIterator(); } class linkedSinglyListIterator implements Iterator { private Node cur = head; @Override public boolean hasNext() { return cur != null; } @Override public E next() { E ret = cur.data; cur = cur.next; return ret; } } }
测试单向链表



