[数据结构与算法]给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。

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

这个题目一看很简单,就是让后驱节点指向前驱节点,然后前驱节点指向后驱节点的后驱节点,但是后驱的节点也需要交换,所以有点棘手。思路就是列举如下图            1  ->  2  -> X -> Y            |      |     |           left   right  aft
第一步: 初始化 preNode = right ,left,right , aft四个节点  指向第二步: right.next = left, pre.next = right, pre = left;

         1  <-> 2    X -> Y
         |           |    | 
       pre.next     left   right  aft
如果X = null, pre.next = null, 如果X != null, Y = null,  pre.next = X;否则 Y -> X (Y.next = X), pre.next = Y, pre = X; 上代码
public ListNode swapPairs(ListNode head) {
//边界条件 如果没有/只有一个节点,直接返回
        if(head == null || head.next == null)
            return head;

        ListNode left = head, right = head.next, aft = right.next;
        ListNode preHead = new ListNode(-1);
        preHead.next = right;
        ListNode pre = new ListNode(-1);//前驱节点
        while(right != null){

            right.next = left;
            pre.next = right;
            pre = left;

            if(aft == null){
                pre.next = null;
                break;
            }
            left = aft;
            right = aft.next;

            if(right == null)
            {
                pre.next = left;
            }else{
                aft = right.next;
            }
        }
        return preHead.next;
    }

  思路就是

原文地址:https://www.cnblogs.com/zhengwangzw/p/11462560.html

时间: 2024-10-29 19:10:35

[数据结构与算法]给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。的相关文章

数据结构和算法设计专题之---判断两个链表是否相交并找出交点

题目: 一个比较经典的问题,判断两个链表是否相交,如果相交找出他们的交点. 首先来看一下如何判断两个链表是否存在相交的节点: 思路: 1.碰到这个问题,第一印象是采用hash来判断,将两个链表的节点进行hash,然后判断出节点,这种想法当然是可以的. 2.当然采用暴力的方法也是可以的,遍历两个链表,在遍历的过程中进行比较,看节点是否相同. 3.第三种思路是比较奇特的,在编程之美上看到的.先遍历第一个链表到他的尾部,然后将尾部的next指针指向第二个链表(尾部指针的next本来指向的是null).

数据结构和算法设计专题之---推断两个链表是否相交并找出交点

题目: 一个比較经典的问题,推断两个链表是否相交.假设相交找出他们的交点. 首先来看一下怎样推断两个链表是否存在相交的节点: 思路: 1.碰到这个问题,第一印象是採用hash来推断,将两个链表的节点进行hash.然后推断出节点,这样的想法当然是能够的. 2.当然採用暴力的方法也是能够的,遍历两个链表.在遍历的过程中进行比較,看节点是否同样. 3.第三种思路是比較奇特的,在编程之美上看到的. 先遍历第一个链表到他的尾部,然后将尾部的next指针指向第二个链表(尾部指针的next本来指向的是null

JavaScript算法----给定一个长度为N的串,求最长回文子串。

/* *给定一个长度为N的串,求最长回文子串. */ function returnStr(str){ console.log(str); var arr = [],s = ""; for(var i=0;i<str.length;i++){ s = ""; if(str.charAt(i)==str.charAt(i+1)){ var j=0; while(str.charAt(i+j+1)==str.charAt(i-j)){ s = str.charAt

给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。

从第0行开始,输出第k行,传的参数为第几行,所以在方法中先将所传参数加1,然后将最后一行加入集合中返回. 代码如下: public static List<Integer> generateII(int row){ ++row; List<Integer> list = new ArrayList<Integer>(); int[][] arr = new int[row][row]; for(int j = 0;j<row;j++) { for(int k =

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

知乎ID: 码蹄疾 码蹄疾,毕业于哈尔滨工业大学. 小米广告第三代广告引擎的设计者.开发者: 负责小米应用商店.日历.开屏广告业务线研发:主导小米广告引擎多个模块重构: 关注推荐.搜索.广告领域相关知识; 题目 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 示例: 给定 1->2->3->4, 你应该返回 2->1->4->3.说明: 你的算法只能使用常数的额外空间.你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 分析 两两合并节点,头结点

Leetcode篇:两两交换链表中的节点

@author: ZZQ @software: PyCharm @file: swapPairs.py @time: 2018/10/20 19:49 说明:给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 示例: 给定 1->2->3->4, 你应该返回 2->1->4->3. 说明: 你的算法只能使用常数的额外空间. 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 思路: 四个节点,分别记录当前需要进行交换的两个节点(first, seco

链表-LeetCode24两两交换链表中的节点

给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 示例: 给定 1->2->3->4, 你应该返回 2->1->4->3. 说明: 你的算法只能使用常数的额外空间. 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 分析:类似于数组中的链表交换,题目中的head是实际的第一个带值的节点,而不是空头节点,由于不能出现空指针,所以,可以创建一个值为0的头结点. /** * Definition for singly-linked list. * st

数据结构与算法系列四(单链表)

1.引子 1.1.为什么要学习数据结构与算法? 有人说,数据结构与算法,计算机网络,与操作系统都一样,脱离日常开发,除了面试这辈子可能都用不到呀! 有人说,我是做业务开发的,只要熟练API,熟练框架,熟练各种中间件,写的代码不也能“飞”起来吗? 于是问题来了:为什么还要学习数据结构与算法呢? #理由一: 面试的时候,千万不要被数据结构与算法拖了后腿 #理由二: 你真的愿意做一辈子CRUD Boy吗 #理由三: 不想写出开源框架,中间件的工程师,不是好厨子 1.2.如何系统化学习数据结构与算法?

力扣——两两交换链表中的节点

给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 示例: 给定 1->2->3->4, 你应该返回 2->1->4->3. /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class