LeetCode024——两两交换链表中的节点

我的LeetCode代码仓:https://github.com/617076674/LeetCode

原题链接:https://leetcode-cn.com/problems/swap-nodes-in-pairs/description/

题目描述:

知识点:链表

思路:三指针遍历链表

如果题目没有要求使用常数的额外空间,我们完全可以用一个数组来存储链表中每一节点的值,再按照数组中的值新建一个链表。

链表相关的题,多设指针,在草稿纸上多演练几次,一定能够轻松解决。

为了避免对头节点的特殊处理,我们设立虚拟头节点dummyHead。

设立三个指针cur1、cur2和cur3,cur1指向待交换的第一个节点的前一个节点,cur2指向待交换的第一个节点,cur3指向待交换的第二个节点。在给cur2和cur3节点赋值之前,我们都要判断能否赋值,即cur1.next和cur1.next.next是否为null。如果为null,我们直接返回dummyHead.next。否则,我们进行交换操作。值得注意的是,交换完之后我们的顺序会变成cur1 -> cur3 -> cur2,因此我们新的cur1应该指向cur2

我们只遍历了一次链表,因此时间复杂度是O(n),其中n为链表中总节点数。整个过程只涉及cur1、cur2和cur3这三个指针的操作,因此空间复杂度是O(1)。

JAVA代码:

public class Solution {
	
	public ListNode swapPairs(ListNode head) {
		ListNode dummyHead = new ListNode(-1);
		dummyHead.next = head;
		ListNode cur1 = dummyHead;
		if(cur1.next == null || cur1.next.next == null) {
			return dummyHead.next;
		}
		ListNode cur2 = cur1.next;
		ListNode cur3 = cur2.next;
		while(true) {
			cur2.next = cur3.next;
			cur1.next = cur3;
			cur3.next = cur2;
			cur1 = cur2;
			if(cur1.next == null || cur1.next.next == null) {
				return dummyHead.next;
			}
			cur2 = cur1.next;
			cur3 = cur2.next;
		}
	}
}

LeetCode解题报告:

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值