Leetcode:19.删除链表的倒数第N个节点
题目描述
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:
本题难度不大,考察链表的基本操作。有两种方法,第一种是遍历两次。第二种用双指针,只需遍历一次。
遍历两次法:
/**
* 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 *p = head; int len = 1;
while(p->next != NULL) //求链表的长度
{p = p->next; len++;}
if(len - n == 0) //特殊情况,删除的是头结点
{head = head->next; return head;}
int i = 1; p = head;
while(i < len - n) //找到被删除的前面那个节点
{p = p->next; i++;}
p->next = p->next->next;
return head;
}
};
遍历一次法:
/**
* 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* dummy = new ListNode(0); //设置空节点,因为这个方法至少要两个节点以上
dummy->next = head;
ListNode *first = dummy, *last = dummy;
for(int i = 1; i <= n; i++)
last = last->next;
while(last->next != NULL)
{first = first->next; last = last->next;}
first->next = first->next->next;
return dummy->next;
}
};