算法练习DAY4||两两交换链表的值||删除链表的倒数第N个节点

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

思路:利用双指针left和right,设置虚拟头结点进行操作,首先left指向要交换的结点的前一个结点,right指向要交换的结点的第一个结点,不断的修改结点的指针域即可完成操作。

时间复杂度:O(n)

空间复杂度:O(1)

双指针法代码如下:

struct ListNode* swapPairs(struct ListNode* head){
    struct ListNode* L = (struct LisNode*)malloc(sizeof(struct ListNode));
    L->next = head;
    struct ListNode* left = L;//初始化指向头结点
    struct ListNode* right = L->next;//初始化指向第一个结点
    while(left && right && right->next){//结束循环的条件,即不满足成对出现的结点(结点0和结点1和结点2和结点3)
        //结点0->结点1->结点2->结点3
        left->next = right->next;//首先修改结点0的指针域,使其指向结点2
        right->next = left->next->next;//修改结点1的指针域,使其指向结点3
        left->next->next = right;//修改结点2的指针域,使其指向结点1
        //结点0->结点2->结点1->结点3
        left = right;//修改left指针指向
        right = left->next;//修改right指针指向
    }
    return L->next;//返回头结点
}

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

思路:利用快慢指针slow,fast解决问题,设置虚拟头结点,首先让fast单独向右移动,使其指向正数第N个结点,然后再使fast和slow同时右移,知道fast指向链表最后一个结点,此时slow指向链表的倒数第N+1个结点,根据此便可删除目标结点。

时间复杂度:O(n)

空间复杂度:O(1)

struct ListNode* removeNthFromEnd(struct ListNode* head, int n){
    //利用快慢指针解决问题
    //设置虚拟头结点
    struct ListNode* L = (struct ListNode*)malloc(sizeof(struct ListNode));
    L->next = head;
    struct ListNode* slow = L;
    struct ListNode* fast = L;
    int i = 0;
    while(inext;
        i++;
    }
    //此时fast指针指向正数第n个结点
    while(fast->next != NULL){
        slow = slow->next;
        fast = fast->next;
    }
    //此时slow指向倒数第n+1个结点
    slow->next = slow->next->next;
    return L->next;
}

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