第十天
我使用的C++,错误的地方请见谅,文章初衷仅用来督促本人学习,如果恰巧能够给你带来帮助,我会十分开心。
一、876. 链表的中间结点
给定一个头结点为 head 的非空单链表,返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。
按照官方解的说法,慢指针一次走一格,快指针一次走两格,当快指针走到末尾,慢指针必定在中间
链表的缺点在于不能通过下标访问元素
class Solution {
public:
ListNode* middleNode(ListNode* head) {
ListNode* slow = head;
ListNode* fast = head;
while (fast != nullptr && fast->next != nullptr){
slow = slow->next;
fast = fast->next->next;
}
return slow;
}
};
二、19. 删除链表的倒数第 N 个结点
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
//删除倒数第N个节点,同样还是快慢指针,前后两个指针相距n
ListNode* dummy = new ListNode(0, head);//建立一个空链表
ListNode* slow = dummy;
ListNode* fast = head;
for (int i = 0; i < n; i++){
fast = fast->next;
}
while (fast != nullptr){
slow = slow->next;
fast = fast->next;
}
slow->next = slow->next->next;
ListNode* ans = dummy->next;
delete dummy;
return ans;
}
};