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 below 15 // DO NOT write main() function 16 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的边界情况,一般来说要求的结果表头会有变化的会经常用这个技巧