O(1)时间删除链表结点

来源:互联网 发布:淘宝卖家订单管理系统 编辑:程序博客网 时间:2024/05/18 00:11

题目:

给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。链表结点定义为

typedef struct Node

{

int val_;

struct Node *pNext;

}Node;


void deleteNode(Node *pHead, Node *pNode);

且假设  该结点指针指向一定在链表中, 存在头结点(值存放结点个数)

思路:

如果挨个遍历,等pNode == pCur时删除结点, 时间复杂度一般为O(n)。所以不行

如果pNode结点不是尾结点,可将pNode的下一个结点的值val赋值给pNode的val,之后删除pNode便可以

如果pNode结点是尾结点,则按照常规方法遍历到该结点的前一个结点,将NULL赋值给该节点的前一个结点的pNext。

代码:

void DeleteNode(Node *pHead, Node *pNode)
{
    Node *pNext = pNode->next;
    if (pNext == NULL) //结点是尾结点
    {
        Node *pPre = pHead;
        Node *pCur = pPre->next;
        while (pCur != pNode)
        {
            pPre = pCur;
            pCur = pCur->next;
        }
        pPre->next = pCur->next;
        free(pCur);

       pCur = NULL;

    }else
    {
        pNode->val_ = pNext->val_;
        pNode->next = pNext->next;
        free(pNext);

       pNext = NULL;

    }    
}

0 0
原创粉丝点击