题目链接

LeetCode

题目描述

给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。

返回删除后的链表的头节点。

注意:此题对比原题有改动

示例 1:

输入: head = [4,5,1,9], val = 5
输出: [4,1,9]
解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.

示例 2:

输入: head = [4,5,1,9], val = 1
输出: [4,5,9]
解释: 给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9.

说明:

  • 题目保证链表中节点的值互不相同
  • 若使用 C 或 C++ 语言,你不需要 freedelete 被删除的节点

解题思路(需要特殊考虑删除元素为第一个的情况)

题中说了链表中的节点值互不相同,也就是说最多只能删除一个。最简单的一种方式就是双指针求解,我们使用两个指针一个指向当前的节点,一个指向当前的上一个节点,以示例1为例画个图看下
18.1 删除链表的节点 - 图1
18.1 删除链表的节点 - 图2

  1. /**
  2. * Definition for singly-linked list.
  3. * struct ListNode {
  4. * int val;
  5. * ListNode *next;
  6. * ListNode(int x) : val(x), next(NULL) {}
  7. * };
  8. */
  9. class Solution {
  10. public:
  11. ListNode* deleteNode(ListNode* head, int val) {
  12. if(head==NULL)
  13. return NULL;
  14. // 第一个结点为要删除的结点时
  15. if(head->val==val)
  16. return head->next;
  17. ListNode *pre,*cur;
  18. cur = head->next;
  19. pre = head;
  20. while(cur!=NULL){
  21. if(cur->val==val){
  22. pre->next = cur->next;
  23. break;
  24. }
  25. pre = cur;
  26. cur = cur->next;
  27. }
  28. return head;
  29. }
  30. };