Remove all elements from a linked list of integers that have value val.
Example:
Input: 1->2->6->3->4->5->6, val = 6
Output: 1->2->3->4->5
题目要求
从链表中删除与所给值相等的元素
思路
首先,链表删除大体有两种方式:都已删除当前节点cur
为例:
- 知道前驱节点pre:则
pre.next=cur.next;cur.next=null
; - 不知道前驱节点:则把下一个节点的值赋值给当前节点,删除下一个节点即可;
cur.val=cur.next.val;cur.next=cur.next.next
所以考虑这个问题的几种特殊情况,也需要以上两种删除节点方式。
- 首先判断当前节点值是否等于所给的值,是,则用赋值方法删除;
- 若当前节点值不等于所给的值了,则判断当前节点的next是否等于,是,则用第一种方法删除。
特殊情况是所有节点的值都等于给定的值,即需要全部删除,则以上操作会剩下一个节点,判断一下另head=null即可。
同样的,需要考虑一开始给定的链表就为空或者就只有一个元素的情况。
代码
public ListNode removeElements(ListNode head, int val) {
ListNode q =head;
if (head==null) {//若链表一开始为空
return head;
}
if (q.next==null&&q.val==val) {//若链表一开始只有一个元素
head=null;
}
while (q!=null&&q.next!=null) {
if (q.val==val) {//先判断当前节点
q.val=q.next.val;
q.next=q.next.next;
continue;
}
if (q.next.val==val) {//再判断后面的节点
q.next=q.next.next;
continue;
}
q=q.next;//都没问题指针向后走一步
}
if (q.next==null&&q.val==val) {//最后判断一下,特殊情况全部为val
head=null;
}
return head;
}
网友评论