一、题目
1、审题
2、分析
将链表中值为 val 的节点去除。
二、解答
1、思路:
方法一、
创建一个头结点,将后边的值为 val 的节点一一删除。
public ListNode removeElements(ListNode head, int val) { if(head == null) return null; ListNode fakeHead = new ListNode(0); while(head != null && head.val == val) // 处理头结点 head = head.next; fakeHead.next = head; while(head != null && head.next != null) { if(head.next.val == val) head.next = head.next.next; else head = head.next; } return fakeHead.next; }
优化: 采用 pre、cur 指针,使代码更简洁
public ListNode removeElements3(ListNode head, int val) { if(head == null) return null; ListNode fakeHead = new ListNode(0); fakeHead.next = head; ListNode curr = head, prev = fakeHead; while(curr != null) { if(curr.val == val) prev.next = curr.next; else prev = prev.next; curr = curr.next; } return fakeHead.next; }
方法二、
采用递归
public ListNode removeElements2(ListNode head, int val) { if(head == null) return null; head.next = removeElements(head.next, val); return head.val == val ? head.next : head; }