删除链表的倒数第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; //返回原节点 }