简单题,主要就是一个链表操作
删除链表节点可按位置分为以下几种情况:
1,要删除的节点在链表头,那么直接返回head->next,即去掉表头,返回后一个节点
2,要删除的节点在链表中间,那么就需要一个指针保存前一个节点,将前一个节点的next指向要删除节点的后一个节点,即pre->next=cur->next
3,要删除的节点在链表末尾,情况基本等同于在链表中间
4,链表中找不到要删除的节点,那么由于循环条件,链表指针会指向链表末尾后一位,cur指针会指向空,也不需要在链表中删除节点,但要考虑其他条件更改节点的操作不同的地方
/**
* 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* pre=head;
ListNode* cur=head->next;
while(cur->val!=val && cur!=nullptr){ //循环搜索要删除的节点
pre=cur; //当指针不为空且不是要删除的节点时,到下一个节点
cur=cur->next;
}
if(cur!=nullptr) //此时cur指向要删除的节点,或是没搜到该节点
pre->next=cur->next; //执行删除节点操作
return head;
}
};