已知ptr是无头节点的单链表的头指针变量,试写出删除该链表中从第i个结点开始的连续k个结点的算法

非常的急
2025-01-04 09:15:51
推荐回答(5个)
回答1:

已知ptr是无头节点的单链表的头指针变量,试写出删除该链表中从第i个结点开始的连续k个结点的算法,我看了各位人兄的回答,都有问题,都没有把头指针的问题处理好,迭代递归算法也有问题, 我在自己机子调试,内存也会报错的;

Linklist DeleteLinklist(Linklist l,int i,int k)
{
Linklist p,temp;
p=l;
int j;
for(j=0;jl=l->next;

for( j=0;j{temp=l->next;
free(l);
l=temp;
}
return p;
}// 返回的仍然是原链表的头指针,指针位置没改变,但是要删 除 的结点已被删除过了
上面算法我已经用程序调试过了,是正确的。
但愿我的回答能让你满意

回答2:

假设节点数据结构是list(指针)定义
void DEL_i_K(list ptr,int i,int k)
{
list li;
while(;i!=0;--i)ptr=ptr->next;
li=ptr;
while(;k!=0;--k)ptr=ptr->next;
li->next=ptr;
}

回答3:

递归实现,由于LZ没给出结构,就由我定义吧。
void DelNode(int i,int k)
{
Node *p,*q;
int j;
p=q=ptr;
if(k==0)
{
for(j=0;j{
q=p;//q为p前驱
p=p->next;
}
//删除p指向的结点
q->next=p->next;
free(p);
return;//出口
}
else
DelNode(i+1,j-1);
}

回答4:

typedef struct _Node
{
int data;
struct _Node *next;
}Node, *LinkList;

LinkList DelNodes(LinkList ptr, int i, int k)
{
if(i>0 && k>0 && NULL!=ptr)
{
Node *start = ptr, *last, *pre;
while((NULL != start) && (--i > 0))
{
pre = start;
start = start->next;
}
if(NULL == start)//个数小于i
return ptr;
last = start;
while((NULL != last) && (--k > 0))
last = last->next;
if(NULL == last)//不足k个
return ptr;
else
last = last->next;
if(start == ptr)//改变表头
ptr = last;
else
pre->next = last;
while(start != last)
{
Node *del = start;
start = start->next;
free(del);
}
}
return ptr;//返回新表头
}

回答5:

楼上的没有delete掉删除的节点
释放内存