24. Swap Nodes in Pairs
1. 问题描述:
输入是一个链表,交换两个相邻节点位置,最后返回操作后的新链表。
2. 解决思路:
该问题主要的环节就是交换操作的过程;所以我们先进行思考,如果要交换两节点的位置,首先需要几个指针去复制暂存元素:
pre:指向每次交换两元素的前一个元素;
p:交换的两元素的第一个元素;
q:交换的两元素的第二个元素;
注意:当头节点和其后一个元素交换时,略有不同,需要把head指向第二个元素;
交换操作步骤:
- q = p->next; 每次交换时先让 q 指向要交换的第二个元素;
- p->next = q->next; 要交换的第一个元素指向下次交换两元素的第一个元素;
- q->next = p; 第二个元素指向第一个元素;
pre->next = q; 上次交换两元素的最后一个元素指向这次交换完成的第一个元素;(如果是头节点,没有上次交换的两元素,则需要把头节点指向q,即head=q)
pre = p; pre指向交换成功后的第二个元素,即交换前的第一个元素p;
- p = p->next; p指向下次要交换两元素的第一个元素;
具体见代码
3. java代码:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution {
public ListNode swapPairs(ListNode head) {
ListNode p = head;
ListNode pre = null;
while(p != null && p.next != null) {
ListNode q = p.next;
p.next = q.next;
q.next = p;
if(pre == null){
head = q;
} else {
pre.next = q;
}
pre = p;
p = p.next;
}
return head;
}
}
4. 算法评估:
希望大家能多多指正交流!