LeetCode鏈表總結2

1. 鏈表構建、增刪

#include <bits/stdc++.h>
using namespace std;

// 定義一個結點模板
template <typename T>
struct Node {
    T data;
    Node *next;
    Node() : next(nullptr) {}
    Node(const T &d) : data(d), next(nullptr) {}
};

// 刪除p結點后面的元素
template <typename T>
void Remove(Node<T> *p){
    if(p == nullptr || p->next == nullptr){
        return ;
    }
    auto tmp = p->next->next;
    delete p->next;
    p->next = tmp;
}

// 在p結點后面插入元素
template <typename T>
void Insert(Node<T> *p, const T &data){
    auto tmp = new Node<T>(data);
    tmp->next = p->next;
    p->next = tmp;
}

// 遍歷鏈表
template<typename T, typename V>
void Walk(Node<T> *p, const V &vistor){
    while(p != nullptr){
        vistor(p);
        p = p->next;
    }
}

int main() {
    auto p = new Node<int>(1);
    Insert(p,2);
    int sum = 0;
    Walk(p, [&sum](const Node<int> *p) ->void { sum += p->data;});
    cout << sum << endl;
    Remove(p);
    sum = 0;
    Walk(p, [&sum](const Node<int> *p) ->void { sum += p->data;});
    cout << sum << endl;

    return 0;
}

2. 字節跳動面試題:Leetcode 143. 重排鏈表

https://leetcode-cn.com/problems/reorder-list/

  • 先使用快慢指針找到鏈表的中間位置,將鏈表分為前后兩部分;
  • 將鏈表的后半部分反轉;
  • 將鏈表的前半部分和后半部分交錯融合成新的鏈表
class Solution {
public:
    void reorderList(ListNode* head) {
        if(!head || !head->next || !head->next->next)
            return ;
        ListNode* slow = head;
        ListNode* fast = head->next;
        while(fast && fast->next){
            slow = slow->next;
            fast = fast->next->next;
        }
        ListNode* backend = slow->next;
        slow->next = nullptr;

        ListNode* r = ReverseList(backend);
        head = mergeList(head, r);
    }

    ListNode* ReverseList(ListNode* head){
        if(!head || !head->next)
            return head; 
        ListNode* prev = NULL;
        ListNode* cur = head;
        ListNode* next = cur->next;
        while(cur != NULL){
            cur->next = prev;
            prev = cur;
            cur = next;
            if(next) next = cur->next;
        }
        return prev;
    }

    ListNode* mergeList(ListNode* l1, ListNode* l2){
        ListNode* head = l1;
        int flag = 1;
        while(l1 && l2){
            if(flag){
                ListNode* tmp = l1->next;
                l1->next = l2;
                l1 = tmp;
                flag = 0;
            }
            else{
                ListNode* tmp = l2->next;
                l2->next = l1;
                l2 = tmp;
                flag = 1;
            }
        }
        return head;
    }
};
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容