地址 https://leetcode-cn.com/problems/shan-chu-lian-biao-de-jie-dian-lcof/
给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。 返回删除后的链表的头节点。 注意:此题对比原题有改动 示例 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++ 语言,你不需要 free 或 delete 被删除的节点
解答
注意三种情况
1 要删除的节点是头结点 那么直接返回头结点的下一个节点即可
return head->next;
2 要删除的节点是尾节点 那么将要删除的节点的前节点的next置为NULL 即是删除.
ListNode* prev->next = NULL; //删除节点是尾部节点
3 常规删除了 假设删除节点的前一个节点是pre 将prev的next指向删除节点的下一个节点即可
ListNode* p; ListNode* prev; prev->next = p->next;
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* deleteNode(ListNode* head, int val) { if(head->val == val) return head->next; ListNode* p = head; while(p != NULL){ if(p->next->val == val){ p->next = p->next->next; break; }else{ p=p->next; } } return head; } };
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* deleteNode(ListNode* head, int val) { if(head->val == val) return head->next; ListNode* prev = head; ListNode* p = head->next; while(p!= NULL){ if(p->val == val){ prev->next= p->next; break; }else{ prev=p; p=p->next; } } return head; } };