每日一题
删除链表的倒数第n个节点
思路
这一题只是在昨天链表中倒数最后k个节点的基础上,增加了删除操作,因此基本思路是相同的。
- 首先,我们可以新建一个表头使其指向原表头,这样当要删除第一个节点使就更加方便了。
- 然后,定义快慢指针,让快指针比慢指针先走n个节点,同时定义一个指针pre,使其指向慢指针的前一个结点,这样方便删除。
- 同时让快慢指针,pre走一个节点,直到快指针走到尾。
- 最后删除slow所在节点即可。
实现代码
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head ListNode类
* @param n int整型
* @return ListNode类
*/
struct ListNode* removeNthFromEnd(struct ListNode* head, int n ) {
struct ListNode* fast ,*slow, *pre;
struct ListNode* newHead;
newHead = (struct ListNode*)malloc(sizeof(struct ListNode));
pre = newHead;
newHead->next = head;
slow = fast = head;
while(n--) //注意,此处不能是--n,例如当n为1时,--n的返回值为0,不能进入循环,而我们要求fast应该走一个节点
fast = fast->next;
while(fast)
{
pre = pre->next;
slow = slow->next;
fast = fast->next;
}
pre->next = slow->next;
return newHead->next; //返回原节点
}