问题描述
Given a linked list, swap every two adjacent nodes and return its head.
For example,
Given 1->2->3->4, you should return the list as 2->1->4->3.
Your algorithm should use only constant space. You may not modify the values in the list, only nodes itself can be changed.
思考:题目非常简单,使用循环即可,递归呢?
想法:
- 1、 使用循环,两个指针即可。不需要递归的开销
- 2、考虑递归。代码更简洁
代码
循环
public class Solution {
public ListNode swapPairs(ListNode head) {
if(head == null || head.next == null)
return head;
ListNode preHead = new ListNode(0);
preHead.next = head;
ListNode pre = preHead;
ListNode p = head;
ListNode q = p.next;
while(q != null){
p.next = q.next;
pre.next = q;
q.next = p;
pre = p;
p = pre.next;
q = p == null? null: p.next;
}
return preHead.next;
}
}
递归
public class Solution {
public ListNode swapPairs(ListNode head) {
if(head == null || head.next == null)
return head;
ListNode p = head;
ListNode q = p.next;
p.next = swapPairs(q.next);
q.next = p;
return q;
}
}