leetcode 203. 移除链表元素

题目

leetcode 203. 移除链表元素_第1张图片

思路

经典的小弟大哥解法:

  • 小弟踩着大哥的脚印
  • 大哥先走一步

题解

// Definition for singly-linked list.
class ListNode {
    int val;
    ListNode next;

    ListNode(int x) {
        val = x;
    }
}

class Solution {
    public ListNode removeElements(ListNode head, int val) {
        ListNode cur = head; // 大哥
        ListNode pre = head; // 小弟

        while (pre != null) { // 如果要删除的是 head,特殊处理
            if (pre.val == val) {
                pre = pre.next;
                head = pre;
            } else break;
        }

        if (head == null) return null; // 保证此时不是空链表

        cur = pre.next; // 大哥先走一步
        while (cur != null) {
            //System.out.println("\ncur=" + cur.val + ", pre=" + pre.val + ", cur.next=" + cur.next);
            if (cur.val == val) { // 要删除
                pre.next = cur.next; // 让小弟 next 指向大哥的 next,pre 不能往前走
                cur = cur.next; // 大哥走一步
                //System.out.println("删除之后,pre=" + pre + ", pre.next=" + pre.next);
            } else {
                pre = cur; // 小弟踩着大哥的脚印
                cur = cur.next; // 大哥先走一步
            }
        }
        return head;
    }
}

leetcode 203. 移除链表元素_第2张图片

评论区题解

前两行是个小技巧。

此题删除链表中元素是很简单的,只需要让待删节点之前一个节点指向待删节点之后一个节点即可。 此题最大的问题就是,题目要求我们要返回新链表中的头结点,如果我们就采用仅仅复制头结点的方式(用H=head)然后用H进行操作,最后返回head。这样就会导致如果头结点也是我们需要删除的节点就会导致错误。当然我们可以采用循环操作判断第一个不是我们要删除的节点,但是这样有些麻烦。最好的方式就是我们创建一个新节点来作为整个链表的头结点,该节点中的值没有意义,只是用该节点来方便我们的操作。如果用H->next=head; 此时 我们操作H的话就把原先的头结点当做了一个普通节点来操作,此时原先的头结点就可以被删除了。最后返回H->next就满足条件了。正是由于有个无意义节点作为头结点会统一操作(把头结点当做普通节点)所以实际链表设计过程中都是有个无意义头结点的,遇到头结点不好解决的问题,大家可以设一个节点试试。

public ListNode removeElements(ListNode head, int val) {
    ListNode header = new ListNode(-1);
    header.next = head;
    ListNode cur = header;
    while(cur.next != null){
        if(cur.next.val == val ){
            cur.next = cur.next.next;
        }else{
            cur = cur.next;
        }
    }
    return header.next;
}

你可能感兴趣的:(leetcode)