题目描述:
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例:
给定 1->2->3->4, 你应该返回 2->1->4->3.
方法1:
主要思路:
(1)思路比较直接,直接对链表的结点 进行成对的处理,既一次处理两个结点,将后面的结点插入到前面的结点即可;
(2)借用一个辅助头结点;
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
//处理特殊的情形
if(head==NULL||head->next==NULL)
return head;
//辅助的头结点
ListNode* dummy=new ListNode(0);
dummy->next=head;
ListNode* pre_head=dummy;
ListNode* tmp_node=NULL;
ListNode* cur_node=head;
//成对的处理结点
while(cur_node!=NULL&&cur_node->next!=NULL){
//这两步将当前结点的下一节点从链表中删除
tmp_node=cur_node->next;
cur_node->next=tmp_node->next;
//这两步将删除的结点插入到当前结点的前面,既实现反转
tmp_node->next=cur_node;
pre_head->next=tmp_node;
//这两步更新下一次要处理的一对结点所要使用的信息
pre_head=cur_node;
cur_node=cur_node->next;
}
//释放内存,返回头结点
head=dummy->next;
delete dummy;
return head;
}
};