题目描述(简单难度)

203. Remove Linked List Elements - 图1

给一个链表,删除链表中的给定值。

解法一

遍历一遍去找目标值,将找到的所有节点删除即可。

为了方便考虑头结点,我们加一个 dummy 指针,next 指向头结点,这个技巧在链表中经常用到。在 19 题 中应该是第一次用到。

  1. public ListNode removeElements(ListNode head, int val) {
  2. ListNode dummyHead = new ListNode(0);
  3. dummyHead.next = head;
  4. ListNode newHead = dummyHead;
  5. //newHead 始终指向要考虑的节点的前一个位置
  6. while (newHead.next != null) {
  7. ListNode next = newHead.next;
  8. if (next.val == val) {
  9. newHead.next = next.next;
  10. } else {
  11. newHead = newHead.next;
  12. }
  13. }
  14. return dummyHead.next;
  15. }

解法二 递归

也可以用递归,会更好理解一些。但是递归需要压栈,需要消耗一定的空间。

  1. public ListNode removeElements(ListNode head, int val) {
  2. if (head == null) {
  3. return head;
  4. }
  5. if (head.val == val) {
  6. return removeElements(head.next, val);
  7. } else {
  8. head.next = removeElements(head.next, val);
  9. return head;
  10. }
  11. }

主要就是对链表的删除,还有 dummy 指针的使用。

windliang wechat

添加好友一起进步~

如果觉得有帮助的话,可以点击 这里 给一个 star 哦 ^^

如果想系统的学习数据结构和算法,强烈推荐一个我之前学过的课程,可以点击 这里 查看详情