这个题目的话,过程本身不算难。主要问题就是要先对开头的两个节点进行处理。因为开头的两个节点是没有前驱节点的,所以就要单独处理,并记住新的链表头。所以能看到针对开头两个和后面的节点处理过程大致是类似的。代码如下:
public ListNode swapPairs(ListNode head) {
if (head == null || head.next == null) //如果没有节点或者只有一个则直接返回return head;ListNode p1 = head, p2 = head.next; //p1和p2指向了要交换的两个节点//先针对头两个节点进行交换,完成后p1为靠后的节点,p2则为靠前的节点p1.next = p2.next;p2.next = p1;//交换完成后,记住新的链表头head = p2;ListNode pre = p1; //每次都要记住交换的两个节点的前一个节点if (p1.next != null) {
p1 = p1.next;p2 = p1.next;} else {
return head;}while (p1 != null && p2 != null) {
//p2!=null保证了剩余要交换的节点数目一定是大于等于2的p1.next = p2.next;p2.next = p1;pre.next = p2; //把交换的两个节点和前面的连接在一起if (p1.next != null) {
pre = p1;p1 = p1.next;p2 = p1.next;} else {
break;}}return head;}