返回
「前端刷题」24. 两两交换链表中的节点,高效解决数据结构问题
前端
2024-01-13 13:15:59
作为一名合格的前端工程师,掌握数据结构和算法是必备技能,而链表作为一种重要的数据结构,经常出现在面试和实际项目中。为了帮助大家更好地理解链表,本文将介绍一种经典的链表操作——两两交换链表中的节点。
算法
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
例如,给定链表 1->2->3->4,两两交换后,链表变为 2->1->4->3。
算法步骤
- 定义两个指针,
prev
和curr
,分别指向链表的当前节点和下一个节点。 - 将
curr.next
指向prev
。 - 将
prev.next
指向curr
。 - 将
prev
和curr
分别指向curr
和curr.next
。 - 重复步骤 2-4,直到
curr
为空。 - 返回
prev
。
示例代码
/*
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* 两两交换链表中的节点
* @param {ListNode} head 链表的头节点
* @return {ListNode} 交换后的链表的头节点
*/
const swapPairs = function(head) {
if (!head || !head.next) {
return head;
}
let prev = null;
let curr = head;
while (curr && curr.next) {
const next = curr.next.next;
curr.next.next = curr;
if (prev) {
prev.next = curr.next;
} else {
head = curr.next;
}
prev = curr;
curr = next;
}
return head;
};
复杂度分析
- 时间复杂度:O(n),其中 n 为链表的长度。
- 空间复杂度:O(1),因为我们没有使用额外的空间。
总结
两两交换链表中的节点是一种经典的链表操作,经常出现在面试和实际项目中。通过本文的介绍,希望你能更好地理解链表,并掌握这种链表操作。
除了本文介绍的方法,还有一些其他的方法可以两两交换链表中的节点。比如,可以使用递归的方法,或者使用栈来辅助交换。大家可以根据自己的喜好选择合适的方法。