day4 链表

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

1.双指针方法,和数组的方法相似,一个快指针一个慢指针

和数组不同的是,数组中快指针先走N步,然后慢指针再走,到快指针指着最后一位的时候,慢指针正好指着需要删除的地方;

但对于链表,快指针需要先走N+1步,到最后的时候慢指针指向需要删除的结点的前一位,直接修改他的->next=->next->next就可以了

 ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode* xuniHead=new ListNode(0);
        ListNode* fast=xuniHead;
        ListNode* slow=xuniHead;
        xuniHead->next=head;
        while(n--&&fast!=NULL)
        {
            fast=fast->next;
        }

        fast=fast->next;//为了让slow后面指向需要删除的节点之前那个
        while(fast!=NULL)
        {
            fast=fast->next;
            slow=slow->next;
        }
        //删除倒数n节点
        ListNode* tmp=slow->next;
        slow->next=tmp->next;
        delete tmp;
        tmp=nullptr;

        return xuniHead->next;

  第二题:两两交换链表中的节点:

1.需要多熟悉这种利用第三者进行交换的思想;

2.还有一个空指针异常的问题,在判断指针是否到了最后的节点(cur->next!=NULL&&cur->next->next!=NULL)不能写反了,因为可能cur->next已经是空了,所以他的->next不存在

3.(有点混乱的)示意图

day4 链表_第1张图片

第三题:相交链表

0.用哈希表更快,下次试试

1.首先两个链表相交就说明从相交结点到最后结点都是相同的,前面差距多远都不重要;

2.两个链表等长概率很小,而且一旦相交,就说明相交部分长度≤短的链表,且出现在长链表的后部分,所以需要长的链表先走一截,直到剩下的长度和短链表相同。

! !参考代码随想录的示范时,但是出现了一个错误

runtime error: member access within null pointer of type ‘ListNode‘

检查后发现,自己在判断两个链表长度的时候出错

        if(lenB>lenA)   //让curA 始终放在最长的链表
        {
            swap(lenA,lenB);
            swap(curA,curB);
        }

        int k=lenA-lenB;
        while(k--)
        {
            curA=curA->next;
        

默认是lenA作为长链表的长度,如果lenB>lenA,就进行交换,但我写成了lenA>lenB,所以K是负值,也就产生了访问空指针的错误

第四题:环形链表2

1.可以用快慢指针的方法求解,也可以用哈希表求解

快慢指针的方法:快指针每次走两步,慢指针每次走一步,如果又环,快指针回先进环里,然后开始循环,慢指针会后进环里,然后循环,两者总会相遇;如果没有环,两者不会相遇;

不理解,下次可以再做一遍

2.哈希表的方法,比较简单

遍历链表,将每个节点放进表里,然后判断表里是否遇上了之前出现过的节点,如果有即是存在环,返回该节点。

(算法题需要些脑子,但很明显,我有一点,但不多

─=≡Σ(((つ•̀ω•́)つ,干饭干饭)

 

你可能感兴趣的:(链表,数据结构)