单链表

leetcode中使用单链表就足够了。
判断链表结构的好坏要对比四个操作

1、访问Access

时间复杂度是O(N),因为链表的存储位置不是连续的,需要遍历才能找到要访问的元素。

2、搜索Search

时间复杂度是O(N)。和访问一样,也是需要遍历才能找到对应的元素。

3、插入Insert

时间复杂度是O(1)。在位置2和3之间插入元素5,只需要将2的next指针指向5,将5的next指针指向3即可。

4、删除Delete

时间复杂度为O(1)。删除位置3,只需要将2的指针指向4即可。

Java链表常用操作

1、创建链表

LinkedList<Integer> list = new LinkedList<>();

2、添加元素

默认在尾部插入元素,O(1)

list.add(1);

在指定位置插入元素

list.add(2, 8);
在索引为2的位置上插入元素8,时间复杂度为O(N),因为要先遍历找到索引为2的位置再插入,插入的操作是O(1)。

3、搜索元素

int a = list.indexOf(8);
搜索元素为8的索引,时间复杂度为O(N)。

4、更新元素

list.set(2, 9);
将索引为2的元素值改为9,时间复杂度为O(N),因为要先找到索引为2的位置。

5、删除元素

list.remove(2);
删除索引为2的元素,时间复杂度为O(N),因为要先遍历找到索引为2的位置再删除,删除的操作是O(1)。

6、获取链表长度

int length = list.size();
时间复杂度为O(1),因为创建链表时内部会创建一个遍历记录长度,增删时会随之变化。

链表相关leetcode

No.203 移除链表元素

思路:定义变量result,result.next=head,最后只要返回result.next即可。定义变量pre,表示当前节点的上一个节点,用于删除节点。使用head遍历链表,只要head不为null,就继续遍历。如果head指向的结点值为目标值,将其删除,即pre.next = head.next;然后head = head.next;如果不为目标值,pre = pre.next;head = head.next;遍历结束后返回result.next

class Solution {
    public ListNode removeElements(ListNode head, int val) {
        if(head == null)
            return null;
        ListNode result = new ListNode();
        result.next = head;
        ListNode pre = result;
        while(head != null) {
            if(head.val == val) {
                pre.next = head.next;
                head = head.next;
            } else {
                pre = pre.next;
                head = head.next;
            }
        }
        return result.next;
    }
}

No.206 反转链表

思路:使用递归法,假设给的序列是1->2->3->4->5->null,要得到5->4->3->2->1->null,传入头节点1,返回新的头节点5,得到的序列为5->4->3->2->!->null。如果传入头节点的下一个节点2,返回新的头节点5,得到的序列为5->4->3->2->null。如果传入节点3,返回新的头节点5,得到的序列为5->4->3–>null。如果传入头节点4,返回新的头节点5,得到的序列为5->4->null。如果传入节点4,即head.next为null或头节点为null,即链表只有一个节点或链表没有节点,不需要进行反转。因此根据上面的推断我们可以递归调用reverseList(ListNode head),传入head.next来进行一层一层的反转。最后只需要将传入的head.next的下一个节点设置为head,head的下一个节点设置为空即可。

class Solution {
    public ListNode reverseList(ListNode head) {
        if(head == null || head.next == null)
            return head;
        ListNode newHead = reverseList(head.next);
        head.next.next = head;
        head.next = null;
        return newHead;
    }
}