首页 > 代码库 > leetcode第23题--Swap Nodes in Pairs
leetcode第23题--Swap Nodes in Pairs
Problem:
Given a linked list, swap every two adjacent nodes and return its head.
For example,
Given 1->2->3->4
, you should return the list as 2->1->4->3
.
Your algorithm should use only constant space. You may not modify the values in the list, only nodes itself can be changed.
本题要我们通过节点的操作来两两置换,而不是通过修改val的值。这题主要就是考察对链表指来指去,最后指向哪里是否清楚。应该要这样考虑,对于 1 2 3 4,先设置一个头指向这个表,假设为0,则0指向1,现在我们想要的结果是0指向2指向1指向3指向4.一步一步来,先将2的next赋值给1的next,然后把1赋值给2的next,这样就有了 2指向1指向3.(如果先把1直接赋值给2的next,那么这是3就被1覆盖了,找不到3了,所以不能这样做)。我们已经有了2指向1指向3指向4,因为0指向的还是1,没改,所以这个时候要将0指向2了,那么就有了0指向2指向1指向3指向4,还没有结束,因为3和4还没有置换。同理,这个时候要先把4的next给3,再把3给4的next。这时候是不是就完了呢,不是的,因为1指向的还是3,所以还需要将4给1的next(这个通过代码中的bef(就是before的意思)来实现,每次把bef赋值为已经置换好的第二个,再把下一个置换好的头赋值给bef的next,就把整个串好了。因为我们的头是0,所以最后返回0的next指针才是答案。
代码如下:
/** * 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 *tmp = new ListNode(0); ListNode *ans = tmp; ListNode *bef = ans; // 用来保证将ans指向下一个二元组 tmp -> next = head; tmp = tmp -> next; while(tmp && (tmp -> next)) { ListNode *m = tmp; ListNode *nn = tmp -> next; tmp = tmp -> next; m -> next = nn -> next;// 例如 1 2 3,先把1指向3,再把2指向1,这样的话就是2 -> 1 -> 3 tmp -> next =m; bef -> next = tmp; // bef的下一个要指向下一个二元组的第一个 tmp = m -> next; bef = m;// 更新bef为转换好的二元组的后一个,为了使得和下一个二元组连接 } return ans -> next; // ans 的第一个为零,next开始才是所要的}};
我在return上面加一个delete ans,居然还是accept。这题规模小所以new的不delete可以。如果我想要delete呢。应该如何?
leetcode第23题--Swap Nodes in Pairs