首页 > 代码库 > 【编程题目】在 O(1)时间内删除链表结点

【编程题目】在 O(1)时间内删除链表结点

60.在 O(1)时间内删除链表结点(链表、算法)。
题目:给定链表的头指针和一个结点指针,在 O(1)时间删除该结点。链表结点的定义如下:
struct ListNode
{
int m_nKey;
ListNode* m_pNext;
};
函数的声明如下:
void DeleteNode(ListNode* pListHead, ListNode* pToBeDeleted);

 

思路:把当前结点的下一个结点的内容复制到当前结点,删除下一结点即可。 注意,链表中只有一个结点时在题目给定的函数声明下无法删除,删除最后一个结点时需要从头寻找。

/*60.在 O(1)时间内删除链表结点(链表、算法)。题目:给定链表的头指针和一个结点指针,在 O(1)时间删除该结点。链表结点的定义如下:struct ListNode{int  m_nKey;ListNode* m_pNext;};函数的声明如下:void DeleteNode(ListNode* pListHead,  ListNode* pToBeDeleted);*/#include <stdio.h>#include <stdlib.h>typedef struct ListNode{    int  m_nKey;    ListNode* m_pNext;}ListNode;void DeleteNode(ListNode* pListHead,  ListNode* pToBeDeleted){    if (pToBeDeleted == NULL || pListHead == NULL)    {        return;    }    if (pToBeDeleted->m_pNext == NULL) //删除最后一个节点    {        ListNode* x = pListHead;        if (pToBeDeleted == pListHead) //只有一个节点        {            printf("can‘t delete the only note\n");        }        else        {            while (x->m_pNext != pToBeDeleted) //删除最后一个节点必须循环删 直接赋值NULL是不行的 因为输入的是指针的一个副本            {                x = x->m_pNext;            }            x->m_pNext = NULL;            free(pToBeDeleted);        }        return;    }    //把下一个结点的数据复制到当前结点,实际删除下一结点    ListNode * tmp = pToBeDeleted->m_pNext;    pToBeDeleted->m_nKey = pToBeDeleted->m_pNext->m_nKey;    pToBeDeleted->m_pNext = pToBeDeleted->m_pNext->m_pNext;    free(tmp); }void printList(ListNode* pListHead){    ListNode* x = pListHead;    while (x != NULL)    {        printf("%d ->" , x->m_nKey);        x = x->m_pNext;    }    printf("\n");}void createList(ListNode* &pListHead){    int data;    scanf("%d", &data);    if (data != 0)    {        pListHead = (ListNode*)malloc(sizeof(ListNode));        pListHead->m_nKey = data;        pListHead->m_pNext = NULL;        createList(pListHead->m_pNext);    }}int main(){    ListNode * p = NULL;    createList(p);    printList(p);    DeleteNode(p, p->m_pNext);    printList(p);    return 0;}