写在前面:本文题单均来自力扣的算法刷题计划,开这个系列主要是以题目与题解的形式对一些常见、常用算法进行归类和总结,希望在促进自己学习的同时也能帮助到看到这篇文章的大家。另外,本文并非一天一更~(最后一天双指针)
目录
题目一:876. 链表的中间结点
题目描述:
题目分析:
这题利用的是快慢指针,我们设置快指针每次往后移动两个元素,慢指针每次往后移动一个元素,当快指针移动到数组的末尾时,慢指针则正好处于中间位置,若数组元素个数为偶数,慢指针则正好处于第二个中间元素的位置。
题解代码:
class Solution {
public:
ListNode* middleNode(ListNode* head) {
ListNode *f = head;
ListNode *l = head;
while(f != NULL && f->next != NULL)
{
f=f->next->next;
l=l->next;
}
return l;
}
};
题目二:19. 删除链表的倒数第 N 个结点
题目描述:
题目分析:
这题我的思路是先求出链表长度 length1 ,则该长度减去 n 得出的位置就是要删除元素的上一个元素的位置 length2 ,再用一个指针 j 遍历链表,当遇到位置 length2 时,删除它下一个元素即可。此外还有一个特判要注意,就是删除链表的头结点时,比如 [1] , n=1 或者 [1,2] , n=2 的情况,返回 head->next 即可。
题解代码:
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* i=head;
ListNode* j=head;
int length1=1;
int length2=1;
while(i->next != NULL)
{
i=i->next;
length1++;
}
if(length1==n)
{
return head->next;
}
while(j->next != NULL)
{
if(length2==length1-n)
{
j->next=j->next->next;
break;
}
j=j->next;
length2++;
}
return head;
}
};