题目描述:
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
进阶:你能尝试使用一趟扫描实现吗?
示例:
输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
输入:head = [1], n = 1
输出:[]
题解:
- 使用快慢指针方法,当快指针走到链表尾的时候,慢指针刚好走到待删除结点的前驱节点,然后令left->next = left->next->next;
- 如果链表只有一个结点的时候,使用快慢指针不方便操作,所以考虑加一个新的头结点,令left = newHewad,rigth = head;
struct ListNode* removeNthFromEnd(struct ListNode* head, int n){
if(head == NULL)
return head;
struct ListNode *left,*right;
struct ListNode *newHead = malloc(sizeof(struct ListNode));//如果只有一个节点而且需要删除的话,新加一个更方便
newHead->next = head;
left = newHead;
right = head;
//快指针先走n步
while(n--)
{
right = right->next;
}
//快慢指针一同移动
while(right)
{
left = left->next;
right = right->next;
}
left->next = left->next->next;
return newHead->next;
}