题目描述都是这样的~
删除链表中等于给定值 val 的所有节点。
示例:
输入: 1->2->6->3->4->5->6, val = 6
输出: 1->2->3->4->5
要很好的完成这个题,首先我们考虑时间复杂度为O(n),空间复杂度为O(1),这才是面试官想看到的,也是我们要努力做到的。
我先简单的画了个图:
val表示链表中的值,一般习惯用data表示,但是由于咱们这个题目中给定了val,就用这个看着更方便一些;next表示地址的引用;head是链表头节点的位置;prev和cur都是我们设定的初值。下面来看看在在线OJ下的代码:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode removeElements(ListNode head, int val) {
if(head == null) return null;
ListNode prev = head;
ListNode cur = head.next;
while (cur != null) {
if (cur.val == val) {
prev.next = cur. next;
cur = cur.next;
} else {
prev = cur;
cur = cur.next;
}
}
if (head.val == val) {
head = head.next;
}
return head;
}
}
前面的都是系统给的,自己主要写框架的中心部分。设定prev的值在head处,cur的值在head。next处,也就是图片上的位置。
1.首先要先判断链表是不是为空,如果为空就不需要删除,直接返回空,程序结束;
2.如果不为空,则进入while循环,在cur值为空时(即链表结束时)跳出循环,在没有跳出循环时,先判断cur.val的值与val的值是否相等,如果相等,则找到了第一个需要删除的数,令pevr.next = cur.next, cur=cur.next,
第一个元素就被删除了。如图所示:
- 如果cur.val != val,则prev和cur继续向后寻找,即
prev= cur,cur = cur.next;
直到循环退出,就删除了除第一个元素以外的所有需要删除的值。 - 走到这儿,看似结束了,但是如果第一个元素也是需要删除的值,我们就漏掉了。那么怎么删除第一个元素呢?这儿我们用if判断,如果head.val = val,就把head的位置向后移就好,即head.next.
此时这个删除链表中等于给定值val的程序才算真正完成,要注意一点,while循环结束后再判断第一个元素是否需要删除,因为此时的第二个元素是肯定不需要删除的,这个if一定要写在while循环外面,等while循环结束后才能判断。且,一定要有返回值,返回val的值!!