1 Given a linked list, swap every two adjacent nodes and return its head.2 3 For example,4 Given 1->2->3->4, you should return the list as 2->1->4->3.5 6 Your algorithm should use only constant space. You may not modify the values in the list, only nodes itself can be changed.
这道题属于链表操作的题目,思路比较清晰,就是每次跳两个节点,后一个接到前面,前一个接到后一个的后面,最后现在的后一个(也就是原来的前一个)接到下下个结点(如果没有则接到下一个)。坑爹地多次过,全都是写程序时不注意的小问题,书写习惯还需要进一步改善。遇到的bug有:忘记return语句;定义ListNode runner = head.next,却将判断head==null的情况放在这句之后; 忘记了新的head将不会是原来的那个head,而是head.next;
所以以后遇到runner.next.next的情况要先确保runner.next != null; 遇到runner.next的情况要先确保runner != null
1 /** 2 * Definition for singly-linked list. 3 * public class ListNode { 4 * int val; 5 * ListNode next; 6 * ListNode(int x) { 7 * val = x; 8 * next = null; 9 * }10 * }11 */12 public class Solution {13 public ListNode swapPairs(ListNode head) {14 // Start typing your Java solution below15 // DO NOT write main() function16 ListNode dummy = new ListNode(0);17 dummy.next = head;18 ListNode curr = dummy;19 ListNode node1 = null;20 ListNode node2 = null;21 22 while(curr.next!=null && curr.next.next!=null){23 node1 = curr.next; 24 node2 = node1.next;25 ListNode next =node2.next; 26 curr.next = node2;27 node2.next = node1;28 node1.next = next; 29 curr=node1;30 }31 return dummy.next;32 }33 }
这道题中用了一个辅助指针作为表头,这是链表中比较常用的小技巧,因为这样可以避免处理head的边界情况,一般来说要求的结果表头会有变化的会经常用这个技巧