这道题还是比较简单,我看完题目的想法就是借助一个第三变量,来改变两个节点的指针的指向,比如我要改变1和2节点的指向,我用h1表示节点1,我创建一个新的节点ans,先拿ans指向节点2(ans.next = h1.next),然后再拿节点1指向节点3(h1.next = h1.next.next),然后再拿节点2指向节点1(ans.next.next = h1),现在的情况就是ans --> 2 -->1(h1) -->3,接下来要交换节点3和节点4,我把h1移到3的位置(h1=h1.next)和ans移到h1的前面一个位置(ans=ans.next.next),现在的情况就是 -->2--->1(ans) -->3(h1) -->4,接下来就可以像交换1和2一样交换3和4了。但是移动h1和ans之前我们先做判断如果3的位置是null或者4的位置是null就不用再交换了直接返回答案即可,答案就是我们创建的ans的下一个节点,所以再创建ans的同时我就用一个result变量储存ans的地址,最后返回resutl->next即可,一下是我的代码:
class Solution {public ListNode swapPairs(ListNode head) {ListNode h1 = head;if(h1 == null || h1.next == null)return h1;ListNode ans = new ListNode();ListNode result = ans;while(h1 != null && h1.next != null){ans.next = h1.next;h1.next = h1.next.next;ans.next.next = h1;if(h1.next != null){h1 = h1.next;}else{return result.next;}ans = ans.next.next;}return result.next;}
}
看看题解做法:
题解的第一种做法是使用递归,用head表示原始链表的第一个节点,新链表的第二个节点,用newHead表示原始链表的第二个节点,新链表的第一个节点。原始链表的其余节点的头节点是newHead.next,令head.next=swapPairs(newHead.next),表示将其余节点进行两两交换,交换后的头节点是head的下一个节点,然后令newHead.next=head,即完成了所有节点的交换,最后返回新链表的头节点newHead,
class Solution {public ListNode swapPairs(ListNode head) {if (head == null || head.next == null) {return head;}ListNode newHead = head.next;head.next = swapPairs(newHead.next);newHead.next = head;return newHead;}
}
第二种方法就和我的解法一样他管这个ans节点叫做哑节点。