目录
1.链表的回文结构
分析
代码
2.链表分割
编辑分析
代码
1.链表的回文结构
分析
这道题的难点是空间复杂度为O(1)
结合逆置链表+找到链表的中间节点就可以解决了。
先找到链表的中间节点,再对中间节点的下一个节点进行逆置,返回值为最后一个节点。
再把数据的两端进行比较,遇到不等的或者第二个头走到空,就结束了。全等返回真,不等返回假。
代码
/*
struct ListNode {int val;struct ListNode *next;ListNode(int x) : val(x), next(NULL) {}
};*/class Partition {
public:ListNode* partition(ListNode* pHead, int x) {if (pHead == nullptr || pHead->next == nullptr) {return pHead;}ListNode* less_head = new ListNode(0); // 头节点,小于 x 的节点链表ListNode* less_tail = less_head; // 尾节点,用于连接小于 x 的节点ListNode* greater_equal_head = new ListNode(0); // 头节点,大于等于 x 的节点链表ListNode* greater_equal_tail = greater_equal_head; // 尾节点,用于连接大于等于 x 的节点ListNode* current = pHead;while (current != nullptr) {if (current->val < x) {less_tail->next = current;less_tail = less_tail->next;} else {greater_equal_tail->next = current;greater_equal_tail = greater_equal_tail->next;}current = current->next;}// 将两个链表连接起来less_tail->next = greater_equal_head->next;greater_equal_tail->next = nullptr;// 释放多余的头节点ListNode* new_head = less_head->next;delete less_head;delete greater_equal_head;return new_head;}
};
2.链表分割
分析
这题难点在于很容易把它和快排联系,然后美滋滋用快慢指针法,发现一堆坑。
这题思路是分割链表,分成小节点链表和大节点链表,并且始终保证小节点的指针指向小节点链表的尾部,大节点指针指向大节点链表的尾部,再让小节点指针的尾和大节点指针的头相连。
需要注意的是,这题要改变头节点,所以要设置哨兵位。最后也要记得把大节点指针的尾连上空指针。
代码
/*
struct ListNode {int val;struct ListNode *next;ListNode(int x) : val(x), next(NULL) {}
};*/
class Partition {
public:ListNode* partition(ListNode* pHead, int x) {// write code hereif(pHead==nullptr ||pHead->next==nullptr){return pHead;}ListNode* cur = pHead;ListNode* smallhead = new ListNode(0);ListNode* smalltail =smallhead;ListNode* bighead = new ListNode(0);ListNode* bigtail = bighead;while(cur){if(cur->val < x){smalltail->next=cur;smalltail=smalltail->next;}else {bigtail->next = cur;bigtail=bigtail->next;}cur=cur->next;}smalltail->next = bighead->next;bigtail->next=nullptr;ListNode* newhead = smallhead->next;delete smallhead;delete bighead;return newhead;}
};