【力扣刷题】【1-50】19. 删除链表的倒数第 N 个结点

2022/3/19 23:58:37

本文主要是介绍【力扣刷题】【1-50】19. 删除链表的倒数第 N 个结点,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

19. 删除链表的倒数第 N 个结点

1.简单模拟,计算链表长度

  • 如果知道链表的长度,以及倒数第几个节点需要删去,就可得知正数需要删除第几个节点。可以先遍历一次计算出长度,再删除相应节点。

  • 链表相应的题目,可以使用哑巴节点dummy,避免头节点为空的讨论问题,无论何种情况,只需要dummy->next就能正确的返回结果。

  • 时间复杂度O(N)。

  • class Solution {
    public:
        ListNode* removeNthFromEnd(ListNode* head, int n) {
            ListNode* dump=new ListNode();
            ListNode* ind;
            int sz=0;
            dump->next=head;
            while(head){
                sz++;
                head=head->next;
            }
            ind=dump;
            for(int i=0;i<sz-n;i++){
                ind=ind->next;
            }
            ind->next=ind->next->next;        
            return dump->next;
        }
    };
    

2.先后指针

  • 因为目标是倒数第n个节点,我们可以预设两个前后起始位置不同的指针:前指针比后指针多走了n步,那么当前指针走到结尾时,后指针也就走到了目标位置。

  • class Solution {
    public:
        ListNode* removeNthFromEnd(ListNode* head, int n) {
            ListNode* dump=new ListNode();
            dump->next=head;
            ListNode* first=dump;
            ListNode* second=dump;
            for(int i=0;i<n;i++){
                second=second->next;
            }
            while(second->next){
                first=first->next;
                second=second->next;
            }
            first->next=first->next->next;    
            return dump->next;
        }
    };
    


这篇关于【力扣刷题】【1-50】19. 删除链表的倒数第 N 个结点的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程