题目
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例
给定 1->2->3->4, 你应该返回 2->1->4->3.
解题思路
- 使用三个结点,pre,cur,next分别表示当前结点前一结点,当前结点,当前结点后一结点完成交换。
- 先定位到要交换的两个结点,再修改指针指向完成交换
- 更新结点的位置,继续进行下一组结点的交换
- 直到遍历完整个链表,返回交换后链表的头结点即可
代码实现
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode swapPairs(ListNode head) {
//增加dummpy,统一结点的处理
ListNode dummpy = new ListNode(-1);
dummpy.next = head;
ListNode preNode = dummpy;
while(head != null && head.next!= null){
//定位
ListNode curNode = head;
ListNode nextNode = head.next;
//交换
preNode.next = nextNode;
curNode.next = nextNode.next;
nextNode.next = curNode;
//更新
preNode = curNode;
head = curNode.next;
}
return dummpy.next;
}
}
复杂度分析
- 时间复杂度: O ( N ) O(N) O(N)
- 空间复杂度: O ( 1 ) O(1) O(1)