给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* i = head;
ListNode* j = head;
while (n--) {
//超出长度
if (j == NULL) {
return NULL;
}
j = j->next;
}
//倒数n个节点正好是头节点
if (j == NULL) {
i = i->next;
delete head;
return i;
}
//双指针移动,定位到目标节点的前一个
while (j != NULL && j->next != NULL) {
i = i->next;
j = j->next;
}
//删除节点
ListNode* tNode = i->next;
i->next = tNode->next;
delete tNode;
return head;
}
};
使用哑结点,可以简化判断
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* dummy = new ListNode(0);
dummy->next = head;
ListNode* i = dummy;
ListNode* j = dummy;
while (n--) {
//超出长度
if (j == NULL) {
return NULL;
}
j = j->next;
}
//双指针移动,定位到目标节点的前一个
while (j->next != NULL) {
i = i->next;
j = j->next;
}
//删除节点
ListNode* tNode = i->next;
i->next = tNode->next;
delete tNode;
return dummy->next;
}
};