给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
思想:
定义两个指针,一个快指针fast,一个慢指针slow,让快指针先走n步,再让快慢指针一起走,当快指针走到链表最后,慢指针正好走在链表的倒数第n-1个位置,此时删除slow指针的后一个值,即删除了链表第n个位置的值,再考虑一些特殊情况,比如链表只有一个值时,可让slow->next = slow->next->next,删除之后,这时链表为空。
代码实现:
struct ListNode* removeNthFromEnd(struct ListNode* head, int n) {
int i=0;
struct ListNode* slow,* fast = head;
slow = (struct ListNode*)malloc(sizeof(struct ListNode));
slow->next = head;
while(i<n)
{
fast = fast -> next;
i++;
}
while(fast != NULL)
{
fast = fast -> next;
slow = slow -> next;
}
if(slow -> next == head)
return head -> next;
else
slow->next = slow->next ->next;
return head;
}