给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
之前在LeetCode上遇到这道题想的有点简单,没有考虑极端情况,比如N刚好等于链表长度,N等于1等等,所以在写代码时遇到了很多错误,并且自己的思路也不对,所以在编程时遇到了很多问题。
使用两个指针,node先走N步,判断node是否为空,如果为空说明N和链表长度相同,直接返回head->next,如果不为空,让cur和node同时向后走,直到node的next为空,现在cur指向被删节点的前一个结点,直接更新cur的next即可。
代码实现:
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* removeNthFromEnd(struct ListNode* head, int n) {
struct ListNode *node = head;
struct ListNode *cur = head;
struct ListNode *del = NULL;
while(n--){
node = node->next;
}
if(!node){ //n刚好等于链表长度
return head->next;
}
while(node->next){
cur = cur->next;
node = node->next;
}
del = cur->next;
cur->next = cur->next->next;
free(del);
return head;
}