反转链表综合(力扣)

发布于:2024-03-21 ⋅ 阅读:(67) ⋅ 点赞:(0)

206. 反转链表

代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        ListNode * prev = NULL;
        ListNode * cur = head;
        while(cur){
            ListNode * tp = cur->next;
            cur->next = prev;
            prev = cur;
            cur = tp;
        }
        return prev;
    }
};

92. 反转链表 II

代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* reverseBetween(ListNode* head, int left, int right) {
        ListNode * dummy = new ListNode(0,head),*p = dummy;
        for(int i = 0; i < left - 1; i++) p = p -> next;
        ListNode * prev = NULL, * cur = p->next;
        int n = right - left + 1;
        while(n--){
            ListNode * tp = cur -> next;
            cur ->next = prev;
            prev = cur;
            cur = tp;
        }
        p->next->next = cur;
        p->next =prev;
        return dummy->next;
    }
};
//从原链表的顺序上来看
//prev指向最后一个节点,cur指向这一段后续的一个节点, p为这一段的前一个节点

25. K 个一组翻转链表

代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
 //每一次反转结束后,从原链表上来看
 // prev指向这一段的末尾,cur指向这一段后续的下一个节点
class Solution {
public:
    ListNode* reverseKGroup(ListNode* head, int k) {
        int n = 0;
        for(ListNode * cur = head; cur; cur = cur->next)n++;//求长度

        ListNode * dummy = new ListNode(0,head), *p0 = dummy;
        ListNode * prev = NULL, *cur = head;
        while(n >= k){
            n -= k;
            for(int i = 0; i < k; i++){
                    ListNode * tp = cur->next;
                    cur->next = prev;
                    prev = cur;
                    cur = tp;
            }
            ListNode * tp = p0->next;
            p0->next->next = cur;
            p0 ->next = prev;
            p0 = tp;
        }
        return dummy->next;
    }
};
本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到