【LeetCode】24、交换链表节点

这篇博客介绍了如何解决LeetCode的第24题,即两两交换链表中的节点。博主分别展示了递归和非递归两种解法,通过代码实现详细解释了思路。递归解法中,先判断链表是否为空或只有一个节点,然后定义新的头节点和剩余部分,进行节点交换。非递归解法则使用哑节点辅助,逐个交换节点并更新链表。最终,两种方法都成功实现了节点交换并返回交换后的链表。
摘要由CSDN通过智能技术生成

【LeetCode】24、交换链表节点

一、题目描述

给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。

你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

img

image-20201022225158462

想了一小会儿,觉得思路太麻烦,遂看答案。

二、递归解法

递归解法的整体思路是这样

  1. 首先判断当前节点或者当前节点的下一个节点是否为空,若为真,则直接返回头节点(因为没有或只有一个无法交换)
  2. 之后将头节点的后一个节点定义为newHead,将当前节点的大后个节点定义为rest。
  3. 将newHead.next 指向当前节点head,将head.next指向swapPairs(rest)
  4. 最后返回nHead即可。

附上代码:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode swapPairs(ListNode head) {
        if(head == null||head.next ==null){
            return head;
        }
        ListNode rest = head.next.next;
        ListNode nHead = head.next;
        nHead.next = head;
        head.next = swapPairs(rest);
        return nHead;
        
    }
}

三、非递归解法

小白稍微尝试着写了下:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode swapPairs(ListNode head) {
        ListNode p = head;
        ListNode dumb = new ListNode(-1,p);
        int count = 0;
        while(p!=null&&p.next!=null){
            ListNode pn = p.next;
            ListNode nHead = pn.next;
            
            dumb.next = pn;
            p.next =nHead;
            pn.next = p;
            dumb = p;
            p = nHead;
            if(count == 0){
                head = pn;
            }

            count++;
        }
        return head;        

    }
}

过了!

具体思路与题目答案相同

image-20201022233145084

看看答案怎么说!

class Solution {
    public ListNode swapPairs(ListNode head) {
        ListNode dummyHead = new ListNode(0);
        dummyHead.next = head;
        ListNode temp = dummyHead;
        while (temp.next != null && temp.next.next != null) {
            ListNode node1 = temp.next;
            ListNode node2 = temp.next.next;
            temp.next = node2;
            node1.next = node2.next;
            node2.next = node1;
            temp = node1;
        }
        return dummyHead.next;
    }
}

代码比我的更加简洁!以后要多多学习!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值