给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
示例:
给定1->2->3->4
, 你应该返回2->1->4->3
.
说明:
- 你的算法只能使用常数的额外空间。
- 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
思路:
1.p代表上一对交换完成的节点中的后者。l代表即将进行交换节点对的左节点,r代表即将进行交换节点对的右节点。
2.首先将l指向r的下一个节点;在将r指向l;最后将p指向r。即完成当前节点对的交换。
/** * 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||!head->next) return head;//空链和一个元素的链直接返回 ListNode* l=head;//定义需要交换的左右节点 ListNode* r=l->next; ListNode* p; l->next=r->next;//交换第一二个节点 r->next=l; head=r;//首节点赋值为第二个节点 p=l;//p赋值为第一对交换成功的右节点 while(l->next&&l->next->next){//如果剩余节点为0或1则返回head,否则进入循环 l=l->next;//转换到下一节点对 r=l->next; l->next=r->next;//交换节点l,r r->next=l; p->next=r; p=l; } return head; } };大婶结发:原理一样,不过看着更简洁,momomo
/** * 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 **pp = &head, *a, *b; while ((a = *pp) && (b = a->next)) { a->next = b->next; b->next = a; *pp = b; pp = &(a->next); } return head; } };