删除链表节点

原题:在O(1)时间复杂度删除链表节点

给定一个单链表中的表头和一个等待被删除的节点(非表头或表尾)。请在O(1)时间复杂度删除该链表节点。并在删除该节点后,返回表头。

样例:给定1->2->3->4,和节点3,返回1->2->4

void deleteNode(ListNode *node)
{
    if(!node || !node->next)
    {
        return;
    }
    ListNode *delete_node = node->next;
    node->val = delete_node->val;
    node->next = delete_node->next;
    delete delete_node;
}

原题:删除链表中倒数第n个节点

给定一个链表,删除链表中倒数第n个节点,返回链表的头节点

样例:给出链表1->2->3->4->5->null 和 n = 2.删除倒数第二个节点之后,这个链表将变成1->2->3->5->null

ListNode *removeNthFromEnd(ListNode *head, int n)
{
    if(head == NULL || n < 0)
    {
        return NULL;
    }
    ListNode *dummy = new ListNode(INT_MIN);
    dummy->next = head;
    ListNode *predel = dummy;
    for(int i = 1; i <= n; i++)
    {
        head = head->next;
    }
    while(head != NULL)
    {
        predel = predel->next;
        head = head->next;
    }
    predel->next = predel->next->next;
    return dummy->next;
}

原题:删除链表中的重复元素,给定一个排序链表,删除所有重复的元素,每个元素只保留一个。

样例:给出1->1->2->null,返回1->2->null.  给出1->1->2->3->3->null,返回1->2->3->null

ListNode *deleteDuplicate(ListNode *head)
{
    if(head == NULL)
    {
        return NULL;
    }
    ListNode *cur = head;
    while(cur->next != NULL)
    {
        if(cur->val == cur->next->val)
        {
            cur->next = cur->next->next;
        }
        else
        {
            cur = cur->next;
        }
    }
    return head;
}

原题:删除排序链表中的重复数字 II

给定一个排序链表,删除所有重复的元素只留下原链表中没有重复的元素

样例:给出1->2->3->3->4->4->5->null,返回1->2->5->null

给出1->1->1->2->3->null, 返回2->3->null

ListNode *deleteDuplicate(ListNode *head)
{
    if(head == NULL)
    {
        return NULL;
    }
    ListNode *dummy = new ListNode(0);
    dummy->next = head;
    head = dummy;
    while(head->next != NULL && head->next->next != NULL)
    {
        if(head->next->val == head->next->next->val)
        {
            int val = head->next->val;
            while(head->next != NULL && head->next->val == val)
            {
                head->next = head->next->next;
            }
        }
        else
        {
            head = head->next;
        }
    }
    return dummy->next;
}

你可能感兴趣的:(删除链表节点)