【编程题目】在 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;

}

 

你可能感兴趣的:(编程)