三指针法(迭代)
核心思想:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode swapPairs(ListNode head) {
if(head == null || head.next == null)//空链表或只有头结点的链表
return head;
ListNode resList = new ListNode(0, head);//结果链表的理论头结点
ListNode left = resList;//交换结点的相邻前一个结点
ListNode mid = head;//交换结点中的前一个结点
ListNode right = head.next;///交换结点中的后一个结点
while(right != null){
mid.next = right.next;
right.next = mid;
left.next = right;
left = mid;//下一对交换结点的相邻前一个结点
if(mid.next != null)
mid = mid.next;
right = mid.next;
}
return resList.next;
}
}
递归解法
核心思想: 递归的终止条件为链表为空链表或者链表只有一个头结点,否则新头结点newHead指向旧头结点head,而旧头结点head指向链表中其余结点交换后的结果(由递归完成)
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode swapPairs(ListNode head) {
if(head == null || head.next == null)//终止条件
return head;
ListNode newHead = head.next;//新头结点
head.next = swapPairs(newHead.next);//旧头结点head指向链表中其余结点交换后的结果
newHead.next = head;//新头结点指向旧头结点
return newHead;
}
}