【R&A】extracts&remove-nth-node-from-end-of-list

摘录

人们的行为动机是由各种各样的需要决定的,这些需要有基本的生理需要,如饥饿和口渴,还有心理上的需要,如个人成就感的追求。但是生理和心理的需求往往不是很容易区分的。即使像饥饿这种似乎是生理需要的需要也要与个体的个人控制和社会接受的需要发生竞争,从而决定饮食的模式。

当情境恒定(如相同的能力、技能、经验与机会等),通常可以用动机解释人们操作的差异。如果你今天早晨想早点儿起床,以便多学点东西,而你的朋友却不是这样的话,我们就会很容易地描述成这是因为你的动机状态与你的朋友不同。

删除链表的倒数第N个节点

  • 方法:双指针之快慢指针
  • 过程:


    删除倒数第n个节点
  • 思路:通过fast指针先走n步,然后slow和fast一起走,直到fast指向nullptr,slow就会指向倒数第n个节点;由于链表节点删除要通过改变前一个节点的指向来实现,为了方便,需要设置虚拟头节点,并且让fast开始时多走一步,最后slow指向倒数第n个节点的前一个,方便删除
  • 代码
ListNode* removeNthFromEnd(ListNode *head, int n) {
    ListNode *dummyHead = new ListNode(0, head);
    ListNode *fast = dummyHead;
    ListNode *slow = dummyHead;
    while(n-- && fast != nullptr) {
        fast = fast->next;
    }
    // 如果n大于节点个数
    if (fast == nullptr) {
        return head;
    }
    fast = fast->next; // 多走一步,让slow指向倒数第n+1个节点,方便删除
    while(fast != nullptr){
        fast=fast->next;
        slow=slow->next;
    }
    ListNode *tmp = slow->next;
    slow->next = slow->next->next;
    delete tmp; // 释放被删除节点的内存
    return dummyHead->next;
}
  • 特殊情况分析:节点为0个、倒数n大于节点个数 正常
  • 优化:根据题目提示,其实不存在n大于节点个数的情况,所以可以删除对于代码
  • 时间复杂度分析:O(n)
  • 空间复杂度分析:O(1)
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容