[路飞]-leetcode24 两两交换链表的节点

292 阅读1分钟

我参与11月更文挑战的第18天,活动详情查看:2021最后一次更文挑战

读题

给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

思路一 递归

image.png

var swapPairs = function (head){
    // 边界判断 ,空节点和单节点不需要交换
    if(head == null || head.next == null)return head
    
    let newHead = head.next // 保存新头节点
    head.next = swapPairs(newHead.next) // 将当前头节点指针指向下一个返回的新头
    newHead.next = head // 新头指向当前头节点
    return newHead;
}

思路二 迭代

image.png

/** 首先新建一个虚头temp 
*  1. 声明n1 n2 
* 接下来按顺序改变指向
* temp.next = n2
* n1.next = n2.next
* n2.next = n1

* temp = n1 交换结束 将temp指向下一个位置 进入下一轮交换
*/
// 代码如下
var swapPairs = function(head){
    if(head ==null || head.next == null)return head // 不需要交换
    const dummy = {next: head} // 声明虚头
    let temp = dummy
    while(temp.next && temp.next.next){ //保证能两两交换的条件
        let n1 = temp.next
        let n2= temp.next.next
        // 如图交换
        temp.next = n2
        n1.next = n2.next
        n2.next = n1
        
        // temp 进入下一轮循环
        temp = n1
    
    }
    return dummy.next
} 

链表的交换问题我也是一头雾水啊,必须画图才能慢慢理解,如果交换需要额外的变量如n1,n2 需要声明出来临时保存节点。还有一点的话就是循环的条件,如果在想好循环的条件先置为true,循环里的逻辑写完之后再来确定循环结束的条件就会清晰很多了。

类似的题 leetcode1721 交换链表中的节点 1712题是很简单的题目,这里就不做讲解了。这个题目就是需要确定倒数第k个节点。

image.png