题目地址:https://leetcode-cn.com/problems/swap-nodes-in-pairs/
题目:
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
示例:
给定 1->2->3->4, 你应该返回 2->1->4->3.
说明:
- 你的算法只能使用常数的额外空间。
- 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
试题分析:
这道题看描述很简单,但是真正动手写起来还是有些难度的,因为涉及到多指针的操作,因为涉及到链表上节点的两两交换,所以会涉及到3个节点的操作,当前节点、前置节点、前置的前置节点。算法思路就是顺序遍历链表节点,两两交换位置,交换完成后需要进行指针位置移动,做的过程中最好先画图搞清楚指针交换的过程再动手写代码。
代码:
public ListNode swapPairs2(ListNode head) {
if(head==null || head.next==null){
return head;
}
//涉及到3个节点操作,前置节点、前置前置节点、当前节点
ListNode cur = head.next;
ListNode prev = head;
ListNode prevPrev = null;
head = head.next;
while(prev!=null && cur!=null){
//当前交换节点非空则交换cur和prev
prev.next = cur.next;
cur.next = prev;
//记录前置前置节点为当次排序第二个节点,用于下次交换
prevPrev = prev;
if(prev.next!=null && prev.next.next!=null) {
prev = prev.next;
cur = prev.next;
prevPrev.next = cur;
}else {
break;
}
}
return head;
}
源码路径:com.monkey01.linkedlist.SwapNodesInPairs_24
配套测试代码路径:test目录com.monkey01.linkedlist.SwapNodesInPairs_24Test