1.链表定义

链表即是由节点(Node)组成的线性集合,每个节点可以利用指针指向其他节点。它是一种包含了多个节点的、能够用于表示序列的数据结构。
单向链表: 链表中的节点仅指向下一个节点,并且最后一个节点指向空。
双向链表: 其中每个节点具有两个指针 p、n,使得 p 指向先前节点并且 n 指向下一个节点;最后一个节点的 n 指针指向 null。
循环链表:每个节点指向下一个节点并且最后一个节点指向第一个节点的链表。
时间复杂度:
索引: O(n)
搜索: O(n)
插入: O(1)
移除: O(1)

2.code


//俩链表相加结果逆序放在一个新的链表
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
    ListNode l11 = l1;
    ListNode l22 = l2;
    ListNode lo = new ListNode(0);
    ListNode head = lo;
    int sum = 0;
    while (l11 != null || l22 != null) {
        sum /= 10;
        if (l11 != null) {
            sum += l11.val;
            l11 = l11.next;
        }
        if (l22 != null) {
            sum += l22.val;
            l22 = l22.next;
        }
        head.next = new ListNode(sum % 10);
        head = head.next;
    }
    if (sum / 10 == 1)
        head.next = new ListNode(1);
    return lo.next;
}

//删除链表中指定的元素
public void deleteNode(ListNode node) {
    node.val = node.next.val;
    node.next = node.next.next;
}

//链表逆序展示
public ListNode reverseList(ListNode head) {
    if (head == null) return head;
    ListNode newList = new ListNode(0);
    while (head != null) {
        ListNode tmp = head;
        head = tmp.next;
        tmp.next = newList;
        newList = tmp;
    }
    return newList;
}

/**
 * 回文结构  123321 正反读一样
 * 一个读的快 一个读的慢,
 * 栈先进后出
 *
 * @param head
 * @return
 */
public boolean isPalindrome(ListNode head) {
    ListNode s = head;
    ListNode f = head;
    Stack<Integer> stack = new Stack();

    while (f != null && f.next != null) {
        stack.push(s.val);
        f = f.next.next;
        s = s.next;
    }
    //如果只有一个数
    if (f != null)
        s = s.next;
    while (s.next != null) {
        if (s.next.val != stack.pop()) return false;
        s = s.next;
    }
    return true;
}

//链表排序
public ListNode mergeKLists(ListNode[] lists) {
    ListNode lo = new ListNode(0);
    ListNode head = lo;

    for (int i = 0; i < lists.length; i++) {
        for (int j = 0; j < lists.length - 1; j++) {
            if (lists[j].val < lists[j + 1].val) {
                ListNode tmp = null;
                tmp = lists[j];
                lists[j] = lists[j + 1];
                lists[j + 1] = tmp;
            }
        }
    }
    for (ListNode l : lists) {
        head.next = l;
        head = head.next;
    }
    return lo.next;
}
class ListNode {
    int val;
    ListNode next;

    ListNode(int x) {
        val = x;
    }

}