最近在刷亚麻的tag,准备准备可能即将到来的VO.
题目描述
Given a linked list, swap every two adjacent nodes and return its head.
You may not modify the values in the list’s nodes, only nodes itself may be changed.
example
Given 1->2->3->4, you should return the list as 2->1->4->3.
思路
首先设置一个dummy头节点,然后设置3个指针:l1,l2和prev。l1和l2分别指向要交换的两个node,prev指向上一次交换后的末尾节点,用于更新每组(2个连续的node视为一组)之间的连接。prev初始为dummy。
每次处理2个node,将2个node的顺序换过来之后,交换l1和l2两个指针(方便处理两个指针向后移动)并更新prev的值为l2(此时l2已经过交换),最后再向前移动l1和l2两个指针即可。
复杂度分析
时间复杂度O(n), 空间复杂度O(1)
代码
class Solution {
public ListNode swapPairs(ListNode head) {
ListNode dummy = new ListNode(0);dummy.next = head;if(head == null)return null;ListNode l1 = head, l2 = head.next, prev = dummy;while(l1 != null && l2 != null){
l1.next = l2.next;l2.next = l1;prev.next = l2;// swapListNode tmp = l1;l1 = l2;l2 = tmp;// update prevprev = l2;// move onl1 = l2.next;l2 = (l1 == null) ? l1 : l1.next;}return dummy.next;}
}