一、题目描述
输入一个链表和n,删除倒数第n个节点,输出剩下的节点。 Given linked list: 1->2->3->4->5, and n = 2. After removing the second node from the end, the linked list becomes 1->2->3->5.
二、思路
1.设置两个指针head1、head2,开始时指向第一个节点head
2.head1是快指针,head2是慢指针,他们间隔n,然后遍历链表
3.当head1指向最后一个节点,那么head2指向的下一个节点就是要删除的节点
三、C代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* removeNthFromEnd(struct ListNode* head, int n){
struct ListNode* head1; //定义指向链表节点的指针head1
struct ListNode* head2; //定义指向链表节点的指针head2
head1 = head; //开始head1和head2都指向链表第一个节点head
head2 = head;
for(int i = 0; i < n; i++)
{
head1 = head1->next; //head1向后移动n个节点
if(!head1) //如果只有一个节点,且需要删除,则返回NULL
{
return head->next;
}
}
while(head1->next) //head1还未到最后一个节点,循环遍历
{
head2 = head2->next; //head2开始向后移动
head1 = head1->next; //head1继续向后移动,直到移动到最后一个节点
}
head2->next = head2->next->next; //在他们中间的节点就是要删除的
return head;
}