代码随想录第四天|LeetCode24.两两交换链表中的结点 19.删除链表的倒数第N个结点 160.相交链表

LeetCode24.两两交换链表中的结点

思路       

        构建一个虚拟头结点dummyHead,让cur = dummyHead,然后再考虑链表中的结点个数是奇数个还是偶数个,其循环条件有所不同。奇数:前面偶数个结点两两交换,最后一个不交换,此时循环条件是cur->next->next  != NULL;偶数:cur->next  != NULL。此时交换的就是cur指向的后面两个结点

        注意:在交换过程时,要事先保存两个临时变量,分别时temp1 = cur->next 和temp2 = cur->next->next->next;避免修改cur->next时找不到结点位置。

代码:

class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        ListNode* dummyHead = new ListNode(0);
        dummyHead->next = head;
        ListNode* cur = dummyHead;
        //判断偶数个结点和奇数个结点退出循环的情况
        //1.奇数:前面偶数个结点两两交换,最后一个不交换,此时cur->next->next == NULL
        //2.偶数:cur->next == NULL
        while(cur->next != nullptr && cur->next->next != nullptr){
            ListNode* temp1 = cur->next;
            ListNode* temp2 = cur->next->next->next;
            cur->next = cur->next->next;
            cur->next->next = temp1;//temp1->next->next = temp1;
            cur->next->next->next = temp2;// temp1->next = temp2;
            cur = cur->next->next;
        }
        return dummyHead->next;
    }
};

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

思路:

       先要找到倒数第N个结点的前一个结点,首先构建一个虚拟头结点,再定义两个指针 一个fast,一个slow,fast指针先往前走N步,然后fast和slow指针一起移动,当fast->next == nullptr时,slow指向倒数第N个结点的前一个结点,此时再对slow指针进行操作。

代码:
 

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode* dummyHead = new ListNode(0);
        dummyHead->next = head;
        ListNode* fast = dummyHead;
        ListNode* slow = dummyHead;
        while(n-- && fast != nullptr){
            fast = fast->next;
        }
        //fast = fast->next;
        while(fast->next != nullptr){
            fast = fast->next;
            slow = slow->next;
        }
        ListNode* temp = slow->next;
        slow->next = slow->next->next;
        delete temp;
        return dummyHead->next;
    }
};

LeetCode160.相交链表

题目描述:

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。

思路:

       就是用双指针,

        1. curA和curB分别指向链表A和B的头结点,当链表A为空或者链表B为空时,直接返回NULL。

        2.如果都不为空,curA从链表A开始从头遍历,当遍历到NULL时,此时curA指向headB,开始遍历链表B,curB从链表B开始从头遍历,当遍历到NULL时,此时curB指向headA,开始遍历链表A,如果两个链表相交的话,此时curA遍历过的结点数和curB遍历过的结点数相等,curA和curB指向相交的第一个结点,返回curA。

原理:见文章:https://blog.csdn.net/wanttifa/article/details/124374378

代码:

class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
      if(headA == NULL || headB == NULL){
          return NULL;
      }
      ListNode* curA = headA;
      ListNode* curB = headB;
      while(curA != curB){
          curA = curA == NULL ? headB : curA->next;
          curB = curB == NULL ? headA : curB->next;
      }
      return curA;
    }
};
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值