- 题目:
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
2. 解题思路:
解这个题的过程还算波折,我之前准备就用基本的一趟遍历的方法来写这个题,后来因为要用的指针太多了我自己都搞混了,所以选择了一种比较容易理解的方法。
因为是要交换相邻的值,所以我想的是进行一次遍历,按顺序把链表拆分成两个链表,再按照与拆分时候相反的顺序来进行组合,这样来实现相邻的交换。
3. 解题代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
//使用两个链表对head进行存储,然后再合并的时候对插入的顺序进行改变
ListNode * l1 = new ListNode(0);
ListNode * l2 = new ListNode(0);
ListNode *p = l1;
ListNode *q = l2;
//对head进行分解
while(head!=nullptr){
p->next = head;
head = head->next;
p = p->next;
p->next = nullptr;
if(head!=nullptr){
q -> next = head;
head = head->next;
q = q->next;
q->next = nullptr;
}
}
//对head进行合并
p = l1->next;
q = l2->next;
//给head加一个头结点便于后面的操作
head = new ListNode(0);
ListNode *r = head;
while(p!=nullptr || q!= nullptr){
if(q!=nullptr){
r->next = q;
q = q->next;
r = r->next;
}
if(p != nullptr){
r->next = p;
p = p->next;
r = r->next;
}
}
return head->next;
}
};