给定链表 head 和两个整数 m 和 n. 遍历该链表并按照如下方式删除节点:
开始时以头节点作为当前节点.
保留以当前节点开始的前 m 个节点.
删除接下来的 n 个节点.
重复步骤 2 和 3, 直到到达链表结尾.
在删除了指定结点之后, 返回修改过后的链表的头节点.
来源:力扣(LeetCode)
链接:[https://leetcode.cn/problems/delete-n-nodes-after-m-nodes-of-a-linked-list]
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* deleteNodes(struct ListNode* head, int m, int n)
{
int i,j,temp=0;
struct ListNode q; //新建一个结构体
struct ListNode *p=&q; //新建一个指针指向上边的结构体
p->next=head; //因为头节点直接等于第一个节点,c语言里难道是这么定义头节点的?
while(p->next!=NULL) //一个经典循环
{
for(i=0;i<m;i++) //循环到要删除的位置
{
if(p->next==NULL)
return head;
else
p=p->next;
temp++; //标记当前所在链表的位置
}
for(i=0;i<n;i++) //删除节点的循环
{
if(p->next==NULL) //这步不写应该也可以,安全起见我还是写了
{
return head;
}
else if(p->next->next==NULL) //循环到倒数第二个节点的地址结束,你懂我意思吧!
{
if((temp)%(m+n)>=m) //判断最后一位是不是要删除的节点 temp=链表长度+1-2
{
p->next=NULL;
return head;
}
else
return head;
}
else
p->next=p->next->next;
temp++; //标记当前所在链表的位置
}
}
return head;
}
作者:conspicuous
链接:https://leetcode.cn/problems/delete-n-nodes-after-m-nodes-of-a-linked-list/solution/by-conspicuous-96qk/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。