删除链表中的倒数第N个节点
程序员文章站
2022-07-12 11:55:19
...
删除链表中的倒数第N个节点
描述
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
思路和代码1
- 遍历一遍列表,求出列表的长度len
- 判断是否len==n,若是,则head = head->next
- 倒数第n个节点,也就是顺着数第len-n个节点,遍历到len-n-1的节点,p->next = p->next->next
/**
* 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) {
if(!head || !(head -> next))
return nullptr;
int len = 1;
ListNode* p = head;
while(p->next)
{
len ++;
p = p->next;
}
if(len == n)
{
head = head->next;
return head;
}
p = head;
int k = len - n - 1;
while(k)
{
p = p->next;
k--;
}
p->next = p->next->next;
return head;
}
};
思路和代码2
- 设置两个指针p1和p2
- 让p2先走n步
- 然后p1和p2一起走
- p2到了尾节点,p1的下一个节点就是倒数第n个节点
/**
* 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(-1);
dummy->next = head;
ListNode* p1 = dummy;
ListNode* p2 = dummy;
while(p2!=NULL && n)
{
p2 = p2->next;
n--;
}
while(p2->next!=NULL)
{
p1 = p1->next;
p2 = p2->next;
}
p1->next = p1->next->next;
return dummy->next;
}
};
上一篇: KM匹配算法的C++实现 - Apollo 6.0前景匹配算法理解
下一篇: JAVA反射
推荐阅读