1. 题目:
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例1.
给定 1->2->3->4, 你应该返回 2->1->4->3.
2. 思路:
设置两个快慢指针,快指针每次走两步,慢指针每次走一步,然后交换快慢指针
3. 代码:
public static ListNode swapPairs(ListNode head) {
if (head == null || head.next == null){
return head;
}
ListNode preNode = new ListNode(-1);
preNode.next = head;
ListNode slow = preNode.next;
ListNode fast = preNode.next.next;
//将head设置为第二个元素,否则会丢失结果链表的第一个元素
head = fast;
while (slow!= null && fast != null){
//交换快慢指针
ListNode nodeTemp = fast.next;
slow.next = nodeTemp;
fast.next = slow;
preNode.next = fast;
preNode = slow;
slow = preNode.next;
if (slow != null){
fast = preNode.next.next;
}else {
break;
}
}
return head;
}