Archar_Saber的博客通过本文主要向大家介绍了算法,链表等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
给定单向链表的头指针和第几个节点,定义一个函数在o(1)时间删除该节点。
分析
先遍历找到节点指针,然后进行删除
代码
#include<stdio.h>
#include<stdlib.h>
typedef struct ListNode
{
int value;
ListNode *next;
}ListNode;
void DeleteNode(ListNode* pNode,ListNode* pDelete)
{
if(pNode==NULL||pDelete==NULL)
return;
//删除的节点为头节点
if(pNode==pDelete)
{
delete pDelete;
pDelete=NULL;
pNode=NULL;
}
//删除节点为尾节点
else if(pDelete->next==NULL)
{
ListNode* p=pNode;
while(p->next!=pDelete)
p=p->next;
p->next=NULL;
delete pDelete;
pDelete = NULL;
}
//删除的节点是中间节点
else
{
ListNode* pNext=pDelete->next;
pDelete->value=pNext->value;
pDelete->next=pNext->next;
delete pNext;
pNext=NULL;
}
return;
};
int main()
{
ListNode* m_list=(ListNode*)malloc(sizeof(ListNode));
m_list->value=10;
m_list->next=NULL;
int count=0;
ListNode* pDelete=m_list;
for(int i=0;i<10;i++)
{
ListNode* item=(ListNode*)malloc(sizeof(ListNode));
item->value=i*2;
item->next=NULL;
pDelete->next=item;
pDelete=item;
}
pDelete=m_list;
while(pDelete!=NULL)
{
printf("%d ",pDelete->value);
pDelete=pDelete->next;
}
printf("\n");
printf("请输入要删除的中间节点:");
scanf("%d",&count);
pDelete=m_list;
for(int i=0;i<count-1;i++)
{
pDelete=pDelete->next;
}
DeleteNode(m_list,pDelete);
pDelete=m_list;
while(pDelete!=NULL)
{
printf("%d ",pDelete->value);
pDelete=pDelete->next;
}
printf("\n");
system("pause");
return 0;
}
遇到的问题
没什么问题T.T