刷题:牛客JZ18 删除链表的节点

135 阅读1分钟

网址: www.nowcoder.com/practice/f9…

描述

给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。
1.此题对比原题有改动
2.题目保证链表中节点的值互不相同
3.该题只会输出返回的链表和结果做对比,所以若使用 C 或 C++ 语言,你不需要 free 或 delete 被删除的节点

数据范围: 0<=链表节点值<=10000
0<=链表长度<=10000

 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 *	ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
class Solution {
public:
    ListNode* deleteNode(ListNode* head, int val) {
        if(head==nullptr)   //链表为空
        {
            return head;
        }
        else if(head->val==val)   //头结点为删除结点
        {
            return head->next;
        }
        ListNode* pre=head;
        ListNode* flag=head->next;
        while(flag)
        {
            if(flag->val == val)
            {
                if(flag->next==nullptr)   //尾结点为删除结点
                {
                    pre->next=nullptr;
                    return head;
                }
                pre->next=flag->next;   //中间结点为删除结点
                flag->next=nullptr;
                return head;
            }
            flag=flag->next;
            pre=pre->next;
        }
        return head;
    }
};

总结:

用的双指针,分别指向要判断的结点和此节点的前一个结点。删除的时候先让pre的指针指向删除结点的下一个结点,再把删除结点的指针指向空。
要注意头结点和尾结点是删除结点的问题。

如果用单指针:

if(node.next.val==val)
node.next = node.next.next;

nullptr和null区别如下:

1、nullptr在C语言中一般为关键字,表示空指针,而NULL只是一个宏定义。
2、nullptr可以被自动转换为各种pointer类型,但不会被转换为任何整数类型,而null与0的作用相似,表示空数据。
3、nullptr 能够转换成任何指针类型(包括成员函数指针和成员变量指针)和bool类型(这是为了兼容普通指针都能使用 if(ptr) 判断是否为空指针的形式),但是不能被转换为整数0。