### 题目 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 示例: 给定 1->2->3->4, 你应该返回 2->1->4->3. ### 思路 还是一样的说法,链表的问题只要思路清晰,并且保证没有访问到错误的值,比如NULL,或者对NULL求next,一般没有多大的问题,下面这个问题因为是每两个节点交换,所以最后是有一个额外的节点,用来辅助交换,保存节点信息,下面就具体举例: 要将链表1->2->3->4->5两两进行交换,首先申请一个辅助节点ahead,将其的后继节点设为1,将辅助节点后面节点称为p1节点,将p1后面的那个节点称为nex,这样原链表变成了res->1->2->3->4->5,1其中p1指向1,nex指向2,其后将p1和nex进行交换。 交换的步骤要注意顺序,否则会丢失掉节点信息,首先将ahead的后继节点换成nex,然后将p1的后继节点换成nex的后继节点,最后将nex的后继节点换成p1,这样原来的ahead->p1->nex->(nex->next)就变成了ahead->nex->p1->(nex->next),交换结束然后再调整ahead、p1、nex指向的节点,这里要注意,如果说后面剩下的节点个数只有1个,那么就不用继续交换了,如果说还有大于1个节点,就继续进行交换。将ahead指向交换之后的后一个节点,也就是ahead->nex->p1->(nex->next)中的p1,然后将p1指向ahead->next,nex指向ahead->next->next,这样又进行新一轮的交换,直到最后交换结束。 ### code
/** * 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) { ListNode* ahead=new ListNode(0); ListNode* res=ahead; if(!(head&&head->next)) { return head; } ListNode* p1=head; ListNode* nex=head->next; while(1) { ahead->next=nex; p1->next=nex->next; nex->next=p1; ahead=p1; if(ahead->next&&ahead->next->next) { p1=p1->next; nex=p1->next; } else break; } return res->next; } };