给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例:给定 1->2->3->4, 你应该返回 2->1->4->3.
思路:画一下图会更好理解。
我们通过指针的移动来改变结点的位置,但是两两交换的时候,我们需要设置几个变量来帮助我们解决问题。pre用来作头结点的前一个结点,因为ListNode()函数里面要给它赋值,所以初始化为0;设置一个临时变量temp,使他代替pre去移动,(pre不移动,我们最后返回的是头结点,LeetCode源代码写好了通过头结点来遍历整个链表的函数,我们不用担心);设置循环,只有当头结点及其下一个结点都不是Null才进行两两交换。
循环里面设两个局部变量a,b;a指向head,从头开始;b指向头结点的下一个;此时a,b相邻;
我们接下来的做法是:让b这个结点移到temp的下一个结点去,把a结点接在b后面,把b后面的结点接在a结点后面;
最后让temp指向a结点,head指向a的下一个结点,就可以实现两两交换。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode swapPairs(ListNode head) {
ListNode pre = new ListNode(0);
pre.next = head;
ListNode temp = pre;
while (head != null && head.next != null) {
ListNode a = head;
ListNode b = head.next;
temp.next = b;
a.next = b.next;
b.next = a;
temp = a;
head = a.next;
}
return pre.next;
}
}
end.