Leetcode刷题Java24. 两两交换链表中的节点

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

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

示例:

给定 1->2->3->4, 你应该返回 2->1->4->3.

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/swap-nodes-in-pairs
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

class Solution {
        public ListNode swapPairs(ListNode head) {
//            return swapPairsI(head);

            return swapPairsII(head);
        }

        //方法二:非递归
        //1.定义first为交换节点中前面的节点,second为交换节点中后面的节点
        //2.定义prevNode为first的前驱节点
        //3.交换两个节点,同时更新head和prev节点
        private ListNode swapPairsII(ListNode head) {
            ListNode dummy = new ListNode(0);
            dummy.next = head;
            ListNode prev = dummy;
            while (head != null && head.next != null) {
                //定义两个节点
                ListNode first = head;
                ListNode second = head.next;

                //交换
                prev.next = second;
                first.next = second.next;
                second.next = first;

                //更新head和prev节点
                prev = first;
                head = first.next;
            }
            //返回新的头结点
            return dummy.next;
        }

        //方法一:递归
        //递归本质就是不断重复相同的事情,主要关注三点:
        //1.终止条件
        //2.调用单元做了什么
        //3.返回值
        private ListNode swapPairsI(ListNode head) {
            //终止条件
            if (head == null || head.next == null) return head;
            //调用单元 1-2-3-4转换成2-1-4-3
            ListNode first = head;
            ListNode second = head.next;
            //first连接交换完成的子链表
            first.next = swapPairs(second.next);
            //second连接first
            second.next = first;
            //返回子链表的头结点
            return second;
        }
    }
发布了19 篇原创文章 · 获赞 2 · 访问量 1448

猜你喜欢

转载自blog.csdn.net/Bonbon_wen/article/details/105462416