删除链表中的节点

题目一:删除链表中的节点:

1、时间复杂度为O(n),找到要删除链表的前一个节点,将该节点的next指向要删除的链表的next,然后删除该节点并置为NULL;

2、时间复杂度为O(1),将要删除节点的后面的节点的值赋给删除的节点,将删除节点的next指向后面节点的next,然后删除后面的节点并置为NULL;

注意:要考虑只有一个节点的情况,删除头节点也是尾节点;还要考虑如果要删除的节点是尾节点的情况,时间复杂度为O(n),要顺序遍历到尾节点的前一个节点,然后删除置为NULL;上述两种方法是基于要删除的节点确实在链表中时

题目二:删除链表中重复的节点:

注意:需要考虑头节点重复时,删除头节点,重新修改头节点的情况

思路一:两次遍历,第一次遍历将重复的节点放入set容器,第二次遍历,若节点存在于set容器,则删除该节点;

思路二:遍历的时候删除重复节点;

思路三、递归实现,思路简单,但当链表基本无重复节点时,效率不高

思路二代码:

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
        val(x), next(NULL) {
    }
};
*/
class Solution {
public:
    ListNode* deleteDupli

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值