题目
给你一个链表,删除链表的倒数第
n
个结点,并且返回链表的头结点。
示例 1
输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
示例 2
输入:head = [1], n = 1
输出:[]
示例 3
输入:head = [1,2], n = 1
输出:[1]
提示
- 链表中结点的数目为
sz
1 <= sz <= 30
0 <= Node.val <= 100
1 <= n <= sz
思路:
如果链表为空或者给定参数n小于1,这种情况直接返回。除此之外,遍历链表,每访问一个节点就让n值减1.遍历完后n值有三种情况:
- n == 0 当n等于零时,要删除的节点就是头节点,返回head->next即可
- n < 0 存在倒数第n个节点待删除
- n > 0 当n大于零时,不存在倒数第n个节点
要删除倒数第N个节点,就需要知道倒数第N个节点的前一个节点,若链表长度为len,那么倒数第N个节点的前驱节点应该是第len - N。若n < 0,我们再对链表进行遍历,每经过一个节点n值就加上1,当 n == 0时,当前访问的节点就是待删除节点的前驱节点。
代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* removeNthFromEnd(struct ListNode* head, int n){
if (head == NULL) {
return head;
}
struct ListNode* tmp = head;
while (tmp) {
tmp = tmp->next;
n--;
}
if (n > 0) {
return head;
}
if (n == 0) {
return head->next;
}
tmp = head;
while (++n) {
tmp = tmp->next;
}
tmp->next = tmp->next->next;
return head;
}