有序链表:
按关键值排序。删除链头时,就删除最小(/最大)的值,插入时,搜索插入的位置。
插入时需要比较O(N),平均O(N/2),删除最小(/最大)的在链头的数据时效率为O(1),
如果一个应用需要频繁的存取(插入/查找/删除)最小(/最大)的数据项,那么有序链表是一个不错的选择
优先级队列 可以使用有序链表来实现
有序链表的插入排序:
对一个无序数组,用有序链表来排序,比较的时间级还是O(N^2)
复制时间级为O(2*N),因为复制的次数较少,第一次放进链表数据移动N次,再从链表复制到数组,又是N次
每插入一个新的链结点,不需要复制移动数据,只需要改变一两个链结点的链域
打印
- ----排序前----
- [595, 725, 310, 702, 444]
- ----链表排序后----
- List (first-->last):
- the data is 310
- the data is 444
- the data is 595
- the data is 702
- the data is 725
复制代码
单链表反序:
- public class SingleLinkedListReverse {
-
- public static void main(String[] args) {
- Node head = new Node(0);
- Node temp = null;
- Node cur = null;
-
- for (int i = 1; i <= 10; i++) {
- temp = new Node(i);
- if (i == 1) {
- head.setNext(temp);
- } else {
- cur.setNext(temp);
- }
- cur = temp;
- }//10.next = null;
-
- Node h = head;
- while (h != null) {
- System.out.print(h.getData() + "t");
- h = h.getNext();
- }
- System.out.println();
-
- //反转1
- // h = Node.reverse1(head);
- // while (h != null) {
- // System.out.print(h.getData() + "t");
- // h = h.getNext();
- // }
-
- //反转2
- h = Node.reverse1(head);
- while (h != null) {
- System.out.print(h.getData() + "t");
- h = h.getNext();
- }
-
-
- }
- }
-
- /*
- * 单链表的每个节点都含有指向下一个节点属性
- */
- class Node {
- Object data;//数据对象
- Node next; //下一节点
-
- Node(Object d) {
- this.data = d;
- }
- Node(Object d, Node n) {
- this.data = d;
- this.next = n;
- }
- public Object getData() {
- return data;
- }
- public void setData(Object data) {
- this.data = data;
- }
- public Node getNext() {
- return next;
- }
- public void setNext(Node next) {
- this.next = next;
- }
- //方法1 head被重置
- static Node reverse1(Node head) {
-
- Node p = null; //反转后新的 头
- Node q = head;
- //轮换结果:012,123,234,.... 10 null null
- while (head.next != null) {
- p = head.next; // 第1个 换成第2个 这时p表示原始序列头中的next
- head.next = p.next; // 第2个 换成第3个
- p.next = q; //已经跑到第1位置的原第2个的下一个 就要变成 原第1个
- q = p; //新的第1个 要变成 当前第一个
- }
- return p;
-
- }
- //方法2 head没重置
- static Node reverse2(Node head) {
- //将中间节点的指针指向前一个节点之后仍然可以继续向后遍历链表
- Node p1 = head, p2 = head.next, p3; // 前 中 后
- //轮换结果 :012, 123, 234, 345, 456.... 9 10 null
- while (p2 != null) {
- p3 = p2.next;
- p2.next = p1; //指向后 变 指向前
- p1 = p2; //2、3向前挪
- p2 = p3;
- }
- head.next = null;//head没变,当输出到0时,再请求0.next 为1
- return p1;
- }
- }
复制代码
|