P24两两交换链表中的节点

P24两两交换链表中的节点

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

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

示例:

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

Related Topics:链表

/**
 *方法一:迭代法
 */
class Solution {
    public ListNode swapPairs(ListNode head) {
        //设置哨兵节点prehead,并指定为0,最后直接输出prehead.next即为结果
        ListNode prehead = new ListNode(0);
        prehead.next = head;
        //设置prev指针用来做下标。(最关键的就是prev,因为下面用到的start,end都是从prev来,
        // 所以,当改变prev的值时,等下一个循环时,就可以再次进行交换。)
        ListNode prev = prehead;
        while (prev.next != null && prev.next.next != null) {
            ListNode start = prev.next;
            ListNode end = prev.next.next;
            //将prehead节点指向end节点,0-->2
            prev.next = end;
            //第一个节点指向end之后的节点1-->3
            start.next = end.next;
            //end节点指向第一个节点 2-->1
            end.next = start;
            //综上:0-->2-->1-->3-->4,这里仅仅只是2和1位置变化了,要继续变化位置
            //所以,要将原来prev指针改变位置,进而start,end也会变化。
            //我们要变成1-->4-->3,所以1变成原来的0
            prev = start;
            //这时候根据上面,prev为1的下标,strat = prev.next,则,start为3的下标
            //end = prev.next.next,则,end为4的下标。则有一次交换指针开始了。
        }
        return prehead.next;
    }
}
    /**
     * 递归方式
     * [1,2,3,4,5,6]
     */
    class Solution {
        public ListNode swapPairs(ListNode head) {
            //判断为null的话,直接return
            if (head == null || head.next == null) {
                return head;
            }
            //1的下标为head,定义2的下标为next;
            ListNode next = head.next;
            //让1指向f(3,4,5,6,null);
            head.next = swapPairs(next.next);
            //让2指向1
            next.next = head;
            //综上2-->1-->f(3,4,5,6,null)
            //f(3,4,5,6):4-->3-->f(5,6,null);
            //f(5,6):6-->5-->f(null)
            //结果:2->1->4->3->6->5->null
            return next;
        }
    }
发布了18 篇原创文章 · 获赞 1 · 访问量 558

猜你喜欢

转载自blog.csdn.net/m0_37694106/article/details/104001679