pta链表重排c++
时间: 2024-10-02 13:02:27 浏览: 35
数据结构 双向链表(C++)
pta链表重排(Palindrome Linked List),也称为回文链表,是指链表中的节点按奇数位置到偶数位置,或反过来都能形成回文串。在C++中,实现这个功能的一个常见方法是通过迭代或递归的方式遍历链表,并分别保存两个指针,一个向前移动,一个向后移动,同时交换它们所指向节点的数据。
以下是简单的C++代码示例,展示了如何判断一个单链表是否是回文,以及如何将其转换为回文:
```cpp
#include <iostream>
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
// 判断链表是否为回文
bool isPalindrome(ListNode* head) {
if (head == nullptr || head->next == nullptr)
return true; // 空链表或只有一个元素都是回文
ListNode *slow = head, *fast = head->next;
while (fast && fast->next) {
if (slow->val != fast->val)
return false;
slow = slow->next;
fast = fast->next->next;
}
return true;
}
// 将链表转换为回文
ListNode* palindromize(ListNode* head) {
if (isPalindrome(head))
return head;
ListNode dummy(0); // 创建虚拟头结点
dummy.next = head;
ListNode *prev = &dummy, *cur = head, *rev = nullptr;
while (cur) {
ListNode *nextTemp = cur->next;
cur->next = rev;
if (rev)
rev->prev = cur;
rev = cur;
cur = nextTemp;
prev = prev->next;
}
prev->next = dummy.next;
dummy.next->prev = &dummy;
return dummy.next;
}
void printList(ListNode* head) {
ListNode* temp = head;
while (temp) {
cout << temp->val << " -> ";
temp = temp->next;
}
cout << "nullptr" << endl;
}
int main() {
// 创建一个非回文链表并测试
ListNode* list = new ListNode(1);
list->next = new ListNode(2);
list->next->next = new ListNode(3);
list->next->next->next = new ListNode(4);
list->next->next->next->next = new ListNode(5);
cout << "Original List: ";
printList(list);
// 转换为回文
list = palindromize(list);
cout << "Palindrome List: ";
printList(list);
return 0;
}
```
在这个例子中,`palindromize`函数首先检查链表是否已经是回文,如果不是,则创建一个新的回文结构。然后,通过反转链表的一半并与原链表拼接,实现了链表的回文化。
阅读全文