题目:给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例 1:
输入:head = [1,2,3,4]
输出:[2,1,4,3]
示例 2:
输入:head = []
输出:[]
示例 3:
输入:head = [1]
输出:[1]
思路:设置哨兵节点,先保存原始链表的第一个节点和第三个节点,因为如果让哨兵节点指向第二个节点,第一个节点的信息就会丢失,第三个节点一样,一次需要先保留,第一次反转完后,让遍历指针向后跳两个。
class MyLinkedList {
public:
struct ListNode {
int val;
ListNode* next;
ListNode(int val) :val(val), next(nullptr){}
};
MyLinkedList() {
_size = 0;
SenNode = new ListNode(0);
}
void addtail(int val) {
ListNode* NewNode = new ListNode(val);
ListNode* cur = SenNode;
while (cur->next) {
cur = cur->next;
}
cur->next = NewNode;
_size++;
}
//反转相邻节点
void doublereverse() {
ListNode* cur = SenNode;
while (cur->next&&cur->next->next) {
ListNode* tmp1 = cur->next;
ListNode* tmp2 = cur->next->next->next;
cur->next = cur->next->next;
cur->next->next = tmp1;
cur->next->next->next = tmp2;
cur = cur->next->next;
}
}
void printLinked() {
ListNode* cur = SenNode->next;
while (cur) {
cout<<cur->val<<"->";
cur = cur->next;
}
cout << "NULL";
cout << endl;
}
private:
int _size;
ListNode* SenNode;
};
int main() {
MyLinkedList ss;
ss.addtail(1);
ss.addtail(2);
ss.addtail(3);
ss.addtail(4);
ss.printLinked();
ss.doublereverse();
ss.printLinked();
return 0;
}