版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}
};