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;
}
};