算法训练Day3|链表

51 阅读1分钟

链表操作不熟练,链表反转理解不透彻,递归不清晰

203 移除链表元素

public ListNode removeElements(ListNode head, int val) {
    ListNode dummy = new ListNode(-1);
    dummy.next = head;

    while (dummy.next != null) {
        if (dummy.next.val == val) {
            dummy.next = dummy.next.next;
        } else {
            dummy = dummy.next;
        }
    }

    return head;
}

最开始是这样写的,但是部分用例过不了

be1a4c6619e31c73e5986927d4daef9.jpg

原因:假如第一个元素就是要删除的值,head就被删了,这样返回head没用,修改一下

public ListNode removeElements(ListNode head, int val) {
    ListNode dummy = new ListNode(-1);
    dummy.next = head;

    ListNode current = dummy;

    while (current.next != null) {
        if (current.next.val == val) {
            current.next = current.next.next;
        } else {
            current = current.next;
        }
    }

    return dummy.next;
}

707 设计链表

206 反转链表

public ListNode reverseList(ListNode head) {
    ListNode currnet = head;
    ListNode prev = null;
    ListNode temp;

    while (currnet != null) {
        temp = currnet.next;
        currnet.next = prev;
        prev = currnet;
        currnet = temp;
    }
    return prev;
}

temp保存原节点,current上进行翻转操作

public ListNode reverse(ListNode prev, ListNode current) {
    if (current == null){
        return prev;
    }

    ListNode temp = null;
    temp = current.next;
    current.next = prev;

    return reverse(current, temp);
}

public ListNode reverseList(ListNode head) {
    return reverse(null, head);
}

递归写法