您现在的位置是:首页 >学无止境 >LeetCode:24. 两两交换链表中的节点网站首页学无止境

LeetCode:24. 两两交换链表中的节点

Super algorithm 2023-06-17 20:00:02
简介LeetCode:24. 两两交换链表中的节点
🍎道阻且长,行则将至。🍓

🌻算法,不如说它是一种思考方式🍀


算法专栏: 👉🏻123


一、🌱24. 两两交换链表中的节点

  • 题目描述:给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
  • 来源:力扣(LeetCode)
  • 难度:中等
  • 提示:
    链表中节点的数目在范围 [0, 100] 内
    0 <= Node.val <= 100
  • 示例 1:
    在这里插入图片描述
    输入:head = [1,2,3,4]
    输出:[2,1,4,3]
    示例 2:
    输入:head = []
    输出:[]
    示例 3:
    输入:head = [1]
    输出:[1]

🌴解题

本题要求只能进行节点交换
迭代交换节点,过程如下:
在这里插入图片描述
交换:

  1. pre.next=q;//最开始pre不存在,也可以设置为哑节点(初始为空的节点)
  2. p.next=q.next;
  3. q.next=p;

往后走:

  1. pre=p;
  2. p=p.next;
  3. if(p!=null) //看后面还有节点?
    q=p.next;

注意最后结束的时机:p==null||p.next==null

  • code
class Solution {
    public ListNode swapPairs(ListNode head) {
        if(head==null||head.next==null)
        return head;      
        ListNode pre,p,q;
        p=head;
        head=head.next;
        q=head;
     
        p.next=q.next;
        q.next=p;

        pre=p;
        p=p.next;
        if(p!=null)//其实就结束了
            q=p.next;    
        
        while(true){  
            if(p==null||p.next==null)
                break;            
        
            pre.next=q;            
            p.next=q.next;
            q.next=p;

            pre=p;
            p=p.next;
            if(p!=null)//其实就结束了
                q=p.next;           
        }
        return head;
    }
}

在这里插入图片描述

也有递归法:

class Solution {
    public ListNode swapPairs(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }
        ListNode newHead = head.next;
        head.next = swapPairs(newHead.next);
        newHead.next = head;
        return newHead;
    }
}

🌵 钱塘湖春行 - 白居易
乱花渐欲迷人眼,浅草才能没马蹄。
最爱湖东行不足,绿杨阴里白沙堤。

返回第一页。☝


☕物有本末,事有终始,知所先后。🍭

🍎☝☝☝☝☝我的CSDN☝☝☝☝☝☝🍓

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。