扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
题目说的就是删除p的后继结点.不要把p看作一个孤立的指针,事实上,p是前一个结点指针域.
成都创新互联公司主营孟州网站建设的网络公司,主营网站建设方案,成都APP应用开发,孟州h5小程序定制开发搭建,孟州网站营销推广欢迎孟州等地区企业咨询
q = p-next; // q记录欲删除的结点
p = p-next-next; // 跨过欲删除的结点,也可写作 p-next = q-next
free(q); // 释放该结点占用的空间
将这个指针指向的next节点值copy到本节点,将next指向next-next,并随后删除原next指向的节点。
class node
{
public:
node(int x) : data(x), next(0){}
int data;
node* next;
};
void DelNode(node* pDel)
{
node* pTemp = pDel-next;
memcpy(pDel, pTemp, sizeof(node));
pDel-next = pTemp-next;
delete pTemp;
}
有分才有动力啊哥们。
删除节点很简单,以单链表为例,牢记三点
避免断链,删除掉节点后,前一个节点的p-next一定要指向后一个节点(如果是头节点,记得要将新表头P指向到原来的第二个节点。如果是尾节点,记得要将新的尾节点p-next置为NULL,)。
避免野指针,删除掉节点后,p-next=NULL;
避免内存泄漏,删除的节点,要用free释放堆内存。
如果是双向链表,不过是多了一个对prev操作,道理是一样的。
一:允许打乱顺序
1) 排序
2)删除
二:不允许打乱顺序。
每次从第一个数据节点开始,从该节点后查找相同数据的节点,找到删除之。
Node *p,*q,*s;
if(head==NULL || head-next==NULL)return;
q=p=head-next;
//单链表删除节点,必须持有前一个节点,否则无法删除。
while(p-next)//查找和节点p重复的节点,重复则删除。
{
q=p;
s=q-next;
while(s ){
if(s-data ==p-data){//重复判断,重复,要删除
q-next=s-next;//从链表里删除
free(s); //实际删除节点,释放内存
s=q-next; //保持s=q-next;
}else {
//不重复,准备判断下一个节点,节点向链表后面移动。
q=s;
s=s-next;
}
}
if(p-next)
//
删除后,有可能链表,后面所有节点都删除了,所以要判断一下。
p=p-next;//
节点后移,准备判断下一个数据节点,有没有重复节点。
}
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流