LeetCode19. 删除链表的倒数第N个节点
Posted crazyblogs
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode19. 删除链表的倒数第N个节点相关的知识,希望对你有一定的参考价值。
链接:
https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list
描述:
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?
ListNode* removeNthFromEnd(ListNode* head, int n) {}
思路:
设置两个指针,中间相隔 \(n\) 个元素
之后,两指针共同前进,直到右边指针的下一步为空指针
删除前面指针的下一个元素,即可
注意:使用哑节点(dummy node),避免特殊情况
C++
展开后查看
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode *dummyHead = new ListNode(-1);
dummyHead->next = head;
ListNode *left = dummyHead, *right = dummyHead;
while(n--){
right = right->next;
}
while(right->next != NULL){
right = right->next;
left = left->next;
}
ListNode *deleteNode = left->next;
left->next = deleteNode->next;
delete deleteNode;
ListNode *result = dummyHead->next;
delete dummyHead;
return result;
}
};
Java
展开后查看
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummyHead = new ListNode(-1);
dummyHead.next = head;
ListNode left = dummyHead, right = dummyHead;
while(n-- != 0){
right = right.next;
}
while(right.next != null){
right = right.next;
left = left.next;
}
left.next = left.next.next;
return dummyHead.next;
}
}
以上是关于LeetCode19. 删除链表的倒数第N个节点的主要内容,如果未能解决你的问题,请参考以下文章