Leetcode学习计划-算法入门第5天
题目876:给定一个头结点为 head 的非空单链表,返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。
方案:两种解法,单指针和双指针
单指针
class Solution {
public:
ListNode* middleNode(ListNode* head) {
ListNode* cur=head;
int cnt=0;
while(cur!=nullptr){
cur=cur->next;
cnt++;
}
int s=cnt/2;
ListNode* ans=head;
for(int i=0;i<s;i++){
ans=ans->next;
}
return ans;
}
};
双指针(快慢指针)
class Solution {
public:
ListNode* middleNode(ListNode* head) {
ListNode* slow=head, *fast=head;
while(fast!=nullptr && fast->next!=nullptr){
slow=slow->next;
fast=fast->next;
fast=fast->next;
}
return slow;
}
};
题目19:
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
方案:使用两个指针,快指针先往前走n步,然后快慢指针一起移动 到快指针到链表末尾停止,此时慢指针下一个节点是要删去的节点。
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* pre=new ListNode(0);
pre->next=head;
ListNode* slow=pre,*fast=head;
int i=0;
while(i<n){
fast=fast->next;
i++;
}
while(fast!=nullptr){
fast=fast->next;
slow=slow->next;
}
slow->next=slow->next->next;
ListNode* ans=pre->next;
delete pre;
return ans;
}
};