Leet Code OJ 203. Remove Linked List Elements [Difficulty: Easy]

题目:
Remove all elements from a linked list of integers that have value val.

Example
Given: 1 –> 2 –> 6 –> 3 –> 4 –> 5 –> 6, val = 6
Return: 1 –> 2 –> 3 –> 4 –> 5

翻译:
从一个整数链表中移除所有value为val的元素。
例如
给定: 1 –> 2 –> 6 –> 3 –> 4 –> 5 –> 6, val = 6
返回: 1 –> 2 –> 3 –> 4 –> 5

分析:
首先,既然是移除链表的元素,有2种移法,一种是在遍历到某个元素时,去比较它的下一个元素(移除它的下一个元素),直接修改next指针;另一种是遍历到某个元素时,将下一个元素的值和next指针赋值给当前元素(变相删除了当前元素),但是这种做法有一个局限,就是无法删除链表尾部的元素。
所以,我们只能采用第一种做法,但是这种做法又隐含了一个问题,就是先要确认第一个元素是与val不等的(不然如果从head开始遍历,也就是去比较head的下一个元素,这个时候其实是跳过了head.val与val的比较)。
下面的方案中,我们先通过一个循环来找出满足不等val的条件的第一个元素,将head指针指向它。这步操作完成后,如果head不为空的话,再采用刚刚所说的第一种做法,也就是始终比较它的下一个元素,直至下一个元素为空。

Java版代码(时间复杂度O(n)):

/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */
public class Solution {
    public ListNode removeElements(ListNode head, int val) {
        while(head!=null&&head.val==val){
            head=head.next;
        }
        if(head==null){
            return null;
        }
        ListNode current=head;
        while(current.next!=null){
            if(current.next.val==val){
                current.next=current.next.next;
            }else{
                current=current.next;
            }
        }
        return head;
    }
}

你可能感兴趣的:(LeetCode,算法,链表)