剑指offer——删除链表中的节点

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/puliao4167/article/details/85487273

题目1:在O(1)内删除链表节点。给定单向链表的头指针和一个节点的指针,在规定时间复杂度内删除该节点

解题思路:首先在时间复杂度O(1)就不可能从头遍历链表查找节点。我们把下一个要删除节点的下一个节点的值赋值给指定的节点,然后删除下一个节点即可,再改变一下next指针的指向即可。

具体代码如下:

#include <iostream>
using namespace std;
struct ListNode
{
    int val;
    ListNode* next;
    ListNode(int v):val(v){ }
};

void DelteNode(ListNode **head,ListNode *node)
{
    if(head==NULL || node==NULL)
    {
        return ;
    }
    if(node->next!=NULL)
    {
        ListNode *n=node->next;
        node->val=n->val;
        node->next=n->next;
        delete n;
        n=NULL;
    }
    else if(*head==node)
    {
        delete node;
        node=NULL;
        *head=NULL;
    }
    else{
        ListNode *tmp=*head;
        while(tmp->next!=node)
        {
            tmp=tmp->next;
        }
        delete node;
        node=NULL;
        tmp->next=NULL;
    }
    return ;
}

int main()
{
    int num=5,k;
    ListNode *head=new ListNode(0);
    head->next=NULL;
    ListNode *p=head;
    for(int i=0;i<num;i++)
    {
        cin>>k;
        ListNode *l=new ListNode(k);
        l->next=NULL;
        p->next=l;
        p=p->next;

    }
    for(ListNode *t=head;t!=NULL;t=t->next)
    {
        cout<<t->val<<"  ";

    }
    cout<<endl;
    DelteNode(&head,head->next->next->next);
    for(ListNode *t=head;t!=NULL;t=t->next)
    {
        cout<<t->val<<"  ";

    }
    return 0;
}

题目2:删除排序链表中重复的节点(重点)

    这道题目是很经典的一道题,首先因为要删除指针,所以必须要一个指针指向删除节点的前一个节点,又因为首节点也有可能重复,所以要在链表开始处增加一个头节点。循环过程:如果发现某个节点与下一个节点的值相同,则从该节点往后循环删除所有值相同的节点,然后再把遍历的指针指向第一个值不同的节点,再根据前一个指针pre是否为空判断其next的指向。

    具体代码如下:

class Solution {
public:
    ListNode* deleteDuplication(ListNode* pHead)//删除链表中重复的节点
    {
        if(pHead==NULL ||pHead->next==NULL)
        {
            return pHead;
        }
        ListNode *node=pHead;
        ListNode *pre=NULL;
        while(node)
        {
            ListNode *n=node->next;
            if(n!=NULL && n->val==node->val)
            {
                int tmp=node->val;
                ListNode *k=node;
                while(k!=NULL && k->val==tmp)
                {
                    n=k->next;
                    delete(k);
                    k=n;
                }
                if(pre!=NULL)
                    pre->next=n;
                else
                    pHead=n;
                node=n;
            }
            else{
                pre=node;
                node=n;
            }
        }
        return pHead;
    }
};

猜你喜欢

转载自blog.csdn.net/puliao4167/article/details/85487273
今日推荐