(一)Partition List

https://leetcode.com/problems/partition-list/description/

题目:给出一个链表和一个x值,要求返回一个顺序链表使得小于x的数在链表前面,大于等于x的数在链表后面,保证节点顺序不变。

例如:1->3->2->4->2, 3 变成:1->2->2->3->4

解答:建立两个新的左、右指针及dummy node,使用head指针遍历整个链表,遇到大于等于head的节点则放到右链表,否则放到左链表。最后将左右链表相连。

第一次犯错:忘记将又指针的尾部指向null;

代码:

class Solution {
    public ListNode partition(ListNode head, int x) {
         if (head == null) {
            return head;
        }
        
        ListNode leftDummy = new ListNode(0);
        ListNode rightDummy = new ListNode(0);
        ListNode left = leftDummy;
        ListNode right = rightDummy;
        
        while (head != null) {
            if (head.val >= x) {
                right.next = head;
                right = right.next;
            } else {
                left.next = head;
                left = left.next;
            }
            head = head.next;
        }
        right.next = null;
        left.next = rightDummy.next;
        return leftDummy.next;
    }
}

(二) Merge Two Sorted Lists

https://leetcode.com/problems/merge-two-sorted-lists/description/

AC!

题目:将两个顺序链表合并成一个顺序链表;

解答:依次比较两个链表里的值大小进行排列;

改进:当一个链表指针指向null,另一个链表还没时,可以直接将重新排列的链表尾指向当前指针:

if (l1 != null) {

head.next = l1;

} else {

head.next = l2;

}

代码:

class Solution {
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        ListNode dummy = new ListNode(0);
        ListNode head = dummy;
        
        while (l2 != null && l1 != null) {
            if (l1.val <= l2.val) {
                head.next = l1;
                l1 = l1.next;
            } else {
                head.next = l2;
                l2 = l2.next;
            }
            head = head.next;
        } 
        while (l1 != null) {
            head.next = l1;
            l1 = l1.next;
            head = head.next;
        }
        while (l2 != null) {
            head.next = l2;
            l2 = l2.next;
            head = head.next;
        }
        head.next = null;
        return dummy.next;
    }
}

(三)swap two nodes in linked list

https://leetcode.com/problems/swap-nodes-in-pairs/description/

AC!

题目:两两交换链表中节点位置。如:1->2->4->5->6 转变为: 2->1->5->4->6

解答:使用两个指针遍历链表;

代码:

class Solution {
    public ListNode swapPairs(ListNode head) {
        if (head == null) {
            return head;
        }
        
        ListNode dummy = new ListNode(0);
        dummy.next = head;
        ListNode headNext = head.next;
        ListNode headPrev = dummy;
        
        while (head != null && headNext != null) {
            headPrev.next = headNext;
            head.next = headNext.next;
            headNext.next = head;
            headPrev = head;
            head = head.next;
            if (head != null) {
                headNext = head.next;
            }
        }
        return dummy.next;
    }
}

(四)reorder list

https://leetcode.com/problems/reorder-list/description/

题目:给定一个单链表:L0->L1->...->Ln-1->Ln,

重新排序后为:L0->Ln->L1->Ln-1->L2->Ln-2->...

解答:

第一次犯错:将链表尾连接到头之后,忘记将尾的前一个指针指向空;

第二次犯错:忘记考虑链表头和prevTail重合的情况(偶数链表)。

代码:

class Solution {
    public void reorderList(ListNode head) {
        while (head != null && head.next != null) {
            ListNode prevTail = head;
            while (prevTail.next.next != null) {
                prevTail = prevTail.next;
            }
            ListNode tail = prevTail.next;
            if (head.next == tail) {
                break;
            } 
            tail.next = head.next;
            head.next = tail;
            head = head.next.next;
            prevTail.next = null;
        }
    }
}

(四)Rotate List

https://leetcode.com/problems/rotate-list/description/

题目:将链表尾部的k个节点移到链表头部;

解答:每次将链表最后一个节点移动至链表头,移动k次;

第一次犯错:(超时)先遍历链表,得到链表长度length,循环只需执行 k%length 次;

代码:

class Solution {
    public ListNode rotateRight(ListNode head, int k) {

ListNode tail = head;
        int length = 0;
        
        while (tail != null ) {
            length++;
            tail = tail.next;
        }
        
        if (length == 0 || length == 1) {
            return head;
        }
        
        for (int i = 0; i < k % length; i++) {
            ListNode preTail = head;
            while (preTail != null && preTail.next != null && preTail.next.next != null) {
                preTail = preTail.next;
            }
            tail = preTail.next;
            tail.next = head;
            preTail.next = null;
            head = tail;
        }
        return head;
    }
}

链表Dummy Node相关推荐

  1. 算法工程师面试必考项——链表

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 1 知识点 1.1 什么是链表 提到链表,我们大家都不陌生,在平时 ...

  2. 搞懂单链表常见面试题

    搞懂单链表常见面试题 Hello 继上次的 搞懂基本排序算法,这个一星期,我总结了,我所学习和思考的单链表基础知识和常见面试题,这些题有的来自 <剑指 offer> ,有的来自<程序 ...

  3. 在单链表写入一组数据代码_链表常见操作和15道常见面试题

    什么是单链表 链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer),简单来说链表并不像数组那样 ...

  4. LeetCode Hot100 ---- 链表专题专题

    链表 力扣109:将有序链表转化为二叉搜素树 力扣141:环形链表判断是否有环 力扣142:环形链表检测入口位置 力扣143:重拍链表 力扣160:相交链表 力扣206:反转链表 力扣21:合并两个有 ...

  5. 【IT笔试面试题整理】给定二叉树,给每层生成一个链表

    [试题描述]定义一个函数,给定二叉树,给每层生成一个链表 We can do a simple level by level traversal of the tree, with a slight ...

  6. 写出一段代码将链表中的两个节点位置互换位置_面试 leetcode 算法专题系列(二)—— 链表...

    前言:只照着常考题去刷题确实是一种方法.但调研之后发现自己还是考虑不周,刷题刷的不应该是题,而是解题的思路和熟练程度.于是我决定重新组织一下刷题笔记的讲解顺序,不再以面试常考题来刷.而是以面试出题频率 ...

  7. 有关链表的小技巧,我都给你总结好了

    链表 链表是数据结构里一个很基础但是又很爱考的线性结构,链表的操作相对来说比较简单,但是非常适合考察面试者写代码的能力,以及对 corner case 的处理,还有指针的应用很容易引起 NPE (nu ...

  8. python实现单链表快速排序升序linkedqueue_LeetCode 总结 - 搞定 Linked List 面试题

    链表删除 [203] Remove Linked List Elements [19] Remove Nth Node From End of List [83] Remove Duplicates ...

  9. 力扣 删除链表的倒数第N个节点

    力扣 删除链表的倒数第N个节点 题目描述 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = ...

  10. 【??链表】LeetCode 92. Reverse Linked List II

    LeetCode 92. Reverse Linked List II Solution1: 参考网址:http://www.cnblogs.com/grandyang/p/4306611.html ...

最新文章

  1. 【错误记录】IntelliJ IDEA 编译 Groovy 报错 ( Could not open/create prefs root node Software\JavaSoft\Prefs )
  2. 深度学习在推荐领域的应用
  3. LSTM股票价格预测
  4. 5.报错:ImportError: No module named win32api
  5. Atcoder ARC101 E 树dp
  6. PyODPS 中使用 Python UDF
  7. 最强AI挑战中国英语阅读理解:只得70多分,不如中等生
  8. greenplum管理员日常任务
  9. AB PLC 1769_L24ER_QB1B新机测试固件下载-程序下载
  10. 解决win10上“RDP Wrapper里的Not supported“问题
  11. 基于springboot编写的小程序幸运转盘抽奖功能
  12. keepalived 单播模式
  13. android开发--不安装支付宝客户端调H5页面问题
  14. 分享台阶价格对比逻辑。(商城中购买数量越多,单价越低)
  15. HP246 G6 笔记本升级
  16. 如何在微信中(微信公众号页面)给Vue单页应用设置标题
  17. python openpyxl模块 合并单元格,设置行高,列宽,边框,居中,字体样式
  18. BZOJ1776: [Usaco2010 Hol]cowpol 奶牛政坛
  19. 最全16套vue.js入门和项目实战+素材+源码
  20. 从某一点出发沿任意一方向旋转矩阵计算思考与实现

热门文章

  1. 尚硅谷JDBC学习笔记
  2. vue 直接访问静态图片_在使用vue中实现本地静态图片路径(详细教程)
  3. 编译 nginx + http-flv 模块
  4. ado连接mysql方式_用ADO 连接mysql数据库的方法
  5. U盘文件夹为空恢复方法,恢复U盘的空白文件夹
  6. seo软文标题写作技巧:好的标题是靠这样想出来的
  7. 雷军现身国庆 70 周年阅兵花车!
  8. 恒星物联-河道液位监测系统方案 液位监测
  9. jQuery validate 添加表单验证方法
  10. rust怎么传送坐标_这几天很多人问我传奇到底该怎么玩,有没有攻略什么的