列表

详情


NC289. 删除链表的节点

描述

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

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

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

示例1

输入:

{2,5,1,9},5

输出:

{2,1,9}

说明:

给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 2 -> 1 -> 9

示例2

输入:

{2,5,1,9},1

输出:

{2,5,9}

说明:

给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 2 -> 5 -> 9

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 4ms, 内存消耗: 896KB, 提交时间: 2022-02-09

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 *	ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head ListNode类 
     * @param val int整型 
     * @return ListNode类
     */
    ListNode* deleteNode(ListNode* head, int val) {
        // write code here
        ListNode *myHead = new ListNode(-1);//手动添加一个头节点在头节点之前
        myHead->next = head;
        ListNode *pre = myHead, *cur = head;
        
        while(cur)
        {
            if(cur->val == val)
            {
                cur = cur->next;
                pre->next = cur;//相等,找到了,删除,跳出循环
                break;
            }
            else{
                cur = cur->next;
                pre = pre->next;//不等,依次后走一步
            }
        }
        
        return myHead->next;
    }
};

C++ 解法, 执行用时: 4ms, 内存消耗: 904KB, 提交时间: 2021-11-20

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 *	ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
class Solution {
public:
    ListNode* deleteNode(ListNode* head, int val) {
        ListNode* vhead = new ListNode(-1);
        vhead->next = head;
        for (auto pre = vhead, cur = head, nxt = cur->next; cur; cur = nxt, nxt = cur->next) {
            if (val == cur->val) {
                delete cur;
                pre->next = nxt;
            }
            else pre = cur;
            if (!cur) break;
        }
        return vhead->next;
    }
};

C++ 解法, 执行用时: 4ms, 内存消耗: 908KB, 提交时间: 2022-02-09

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 *	ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head ListNode类 
     * @param val int整型 
     * @return ListNode类
     */
    ListNode* deleteNode(ListNode* head, int val) {
        // write code here
        if(head == nullptr){
            return head;
        }
        if(head->val == val){
            return head->next;
        }
        ListNode* node = head;
        while(node!=nullptr){
            if(node->next->val == val){
                node->next = node->next->next;
                break;
            }
            node = node->next;
        }
        return head;
    }
};

C++ 解法, 执行用时: 4ms, 内存消耗: 912KB, 提交时间: 2021-11-13

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 *	ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head ListNode类 
     * @param val int整型 
     * @return ListNode类
     */
    ListNode* deleteNode(ListNode* head, int val) {
        // write code here
        ListNode* dummy=new ListNode(-1);
        ListNode* pre=dummy,*cur=head;
        pre->next=cur;
        if(!head)return 0;
        while(cur){
            if(cur->val==val){
                cur=cur->next;
                pre->next=cur;
            }
            cur=cur->next;
            pre=pre->next;
        }
        return dummy->next;
    }
};

C++ 解法, 执行用时: 4ms, 内存消耗: 916KB, 提交时间: 2021-11-26

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 *	ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head ListNode类 
     * @param val int整型 
     * @return ListNode类
     */
    ListNode* deleteNode(ListNode* head, int val) {
        ListNode* cur=head,*left;
        if(cur->val==val)
            return head=head->next;
        left=cur;
        cur=cur->next;
        while(cur){
            if(cur->val==val){
                left->next=cur->next;
                return head;
            }
            cur=cur->next;
            left=left->next;
        }
        return head;
    }
};

上一题