(一)题目要求:
给一个链表,两两交换其中的节点,然后返回交换后的链表。
(二)示例:
给出 1->2->3->4, 你应该返回的链表是 2->1->4->3。
你的算法只能使用常数的额外空间,并且不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
(三)题解:
方法一:
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ //方法一:引入头结点,两辆交换结点,注意交换顺序: //(1)保存第二个结点的指针 //(2)第一个结点指向第二个结点的下一个结点 //(3)把第二结点插入第一个结点前 //(4)head指针后移到交换后的第二个结点 class Solution { public: /* * @param head: a ListNode * @return: a ListNode */ ListNode * swapPairs(ListNode * head) { // write your code here ListNode Dummy(0); Dummy.next = head; head = &Dummy; while(head->next && head->next->next) { ListNode *sec_node = head->next->next; head->next->next = sec_node->next; sec_node->next = head->next; head->next = sec_node; head = head->next->next; } return Dummy.next; } };方法二:
//方法二:思路和方法一基本一致,只是具体处理细节不同 //(1)保存下一个要处理结点的指针 //(2)前结点指向第二个结点 //(3)当前处理结点指针后移 //(4)第二个结点指向原第一个结点 //(5)当前处理指针后移(指向交换后的第二个结点) //(6)交换后的第二个结点指向NULL //(7)ret指向下一个要处理的结点 //(8)循环结束后如果有单个结点存在,还需使当前节点指向这个结点 class Solution { public: /** * @param head a ListNode * @return a ListNode */ ListNode* swapPairs(ListNode* head) { // Write your code here if(head==NULL || head->next==NULL) return head; ListNode *helper=new ListNode(0); ListNode *ret=head; ListNode *cur=helper; while(ret && ret->next) { ListNode *next=ret->next->next; cur->next=ret->next; cur=cur->next; cur->next=ret; cur=cur->next; cur->next=NULL; ret=next; } if(ret) cur->next=ret; return helper->next; } };