美文网首页算法数据结构
链表删除结点操作

链表删除结点操作

作者: 人魔七七 | 来源:发表于2018-11-08 15:58 被阅读32次

    前提

    这个链表不存在重复值的结点

    思路

    找到这个结点
    操作被删除结点的前后指针

    复杂度

    O(n) 因为你要找到这个结点

    代码

    - (void)removeObject:(NSObject *)linkData
    {
       
        //分两步 第一步找到当前结点 第二步删除操作
        //声明被删除的结点
        DSNode *deleteNode;
        
        if (linkData)
        {
            //当前指针指向头部结点
            self.current = self.head;
            //跳出条件是当前结点 是 nil
            while (self.current != nil)
            {
                //如果当前结点的值 和 要删除的值一样 就找到了要删除的结点
                if ([self.current.linkData isEqual:linkData])
                {
                    deleteNode = self.current;
                    break;
                    
                }
                self.current = self.current.next;
    
            }
        }
       //找到被删除结点的前后结点 重新操作前后结点的指针 然后把删除的结点nil 分三种情况头部 尾部 以及中间位置
        DSNode *priorNode = deleteNode.prior;
        DSNode *nextNode = deleteNode.next;
        
        if (priorNode == nil)
        {
            self.head = nextNode;
            self.head.prior = nil;
            
        }
        else if (nextNode == nil)
        {
            
            self.tail = priorNode;
            self.tail.next = nil;
        }
        else
        {
            priorNode.next = nextNode;
            nextNode.prior = priorNode;
        }
        deleteNode = nil;
        deleteNode.prior = nil;
        deleteNode.next = nil;
        _count --;
        
    }
    

    用图来描述他的过程

    1. 找到要删除的结点



    循环遍历链表
    如果当前结点不是要找的那么current指针后移动一步
    如果当前结点是要找的结点返回
    如果当前结点是nil跳出循环

    1. 删除


    DSNode *priorNode = deleteNode.prior;
    DSNode *nextNode = deleteNode.next;

    priorNode.next = nextNode;
    nextNode.prior = priorNode;

    deleteNode = nil;
    deleteNode.prior = nil;
    deleteNode.next = nil;

    代码地址

    https://github.com/renmoqiqi/DSLinkedList

    相关文章

      网友评论

        本文标题:链表删除结点操作

        本文链接:https://www.haomeiwen.com/subject/cvpwxqtx.html