• LeetCode题集——分割链表 + 删除排序链表中的重复元素(1+2)


    目录

    题目一:分割链表

    解法一: 双指针

     解法二:头插法

     题目二:删除排序链表中的重复元素

    解法一:单指针

    解法二:快慢指针

     解法三:递归

    题目三:删除排序链表中的重复元素(2)


    题目一:分割链表

    具体要求:

    解法一: 双指针

    将小于特定值,与大于等于特定值分为两组,然后将二者拼接起来,返回新链表即可

    不理解?看图:

    1. class Solution {
    2. public ListNode partition(ListNode head, int x) {
    3. ListNode List1=new ListNode(0);
    4. ListNode List2=new ListNode(0);
    5. ListNode list1=List1;
    6. ListNode list2=List2;
    7. while(head!=null) {
    8. if(head.val<x) {
    9. list1.next=head;
    10. list1=list1.next;
    11. } else {
    12. list2.next=head;
    13. list2=list2.next;
    14. }
    15. head=head.next;
    16. }
    17. list2.next=null;
    18. list1.next=List2.next;
    19. return List1.next;
    20. }
    21. }

    测试通过:

     解法二:头插法

    遍历链表,将每个小于特定值的节点头插到链表头部

    1. class Solution {
    2. public ListNode partition(ListNode head, int x) {
    3. ListNode dummy = new ListNode();
    4. dummy.next = head;
    5. while (head != null && head.next != null) {
    6. int nextVal = head.next.val;
    7. if (nextVal < x) {
    8. ListNode next = head.next;
    9. head.next = head.next.next;
    10. next.next = dummy.next;
    11. dummy.next = next;
    12. } else {
    13. head = head.next;
    14. }
    15. }
    16. return dummy.next;
    17. }
    18. }

    测试通过:

     题目二:删除排序链表中的重复元素

    具体要求:

    解法一:单指针

    将链表遍历一遍,因为链表的数据是有序的,所以只要当前数据与下一个数据相同,则删除当前的下一个节点即可。 

    1. class Solution {
    2. public ListNode deleteDuplicates(ListNode head) {
    3. ListNode cur=head;
    4. while(cur!=null&&cur.next!=null) {
    5. if(cur.val==cur.next.val) {
    6. cur.next=cur.next.next;
    7. } else {
    8. cur=cur.next;
    9. }
    10. }
    11. return head;
    12. }
    13. }

    测试通过:

    解法二:快慢指针

    思路其实很解法一相似,只不过呈现形式不同罢了,快慢指针,是判断快慢指针所指向的数据是否相同,若相同,则跳过快指针对应的节点。 

    1. class Solution {
    2. public ListNode deleteDuplicates(ListNode head) {
    3. if(head==null||head.next==null) {
    4. return head;
    5. }
    6. ListNode fast=head.next;
    7. ListNode slow=head;
    8. while(fast!=null) {
    9. if(fast.val==slow.val) {
    10. slow.next=fast.next;
    11. fast=fast.next;
    12. } else {
    13. fast=fast.next;
    14. slow=slow.next;
    15. }
    16. }
    17. return head;
    18. }
    19. }

    测试通过:

     解法三:递归

    链表具有天然的递归性,链表看成其头节点后挂接一个更短的链表,这个更短的链表看成其头节点后面挂接一个更更短的链表,依次类推。

    1、删除更短链表中所有重复的元素;

    2、判断原链表的头节点的值是否等于经过第 1 步处理后的更短链表头节点的值;

    3、若相等,则返回更短的链表;

    4、否则,将更短的链表挂接在原链表的头节点的后面,再返回。

    1. class Solution {
    2. public ListNode deleteDuplicates(ListNode head) {
    3. //递归终止条件
    4. if(head==null||head.next==null) {
    5. return head;
    6. }
    7. //递归调用,删除
    8. head.next=deleteDuplicates(head.next);
    9. return head.val==head.next.val?head.next:head;
    10. }
    11. }

    测试通过:

    题目三:删除排序链表中的重复元素(2)

    题目具体要求:

    注意与上一道题的区别,这里是将重复数字删除,如1,1,1,2,则结果中将所有1删除,输出:2,而上一道题中,会保留一个1,输出:1,2

    大致思路:

     

     代码:

    1. class Solution {
    2. public ListNode deleteDuplicates(ListNode head) {
    3. if(head==null||head.next==null) {
    4. return head;
    5. }
    6. ListNode cur=new ListNode();
    7. cur.next=head;
    8. ListNode pre=cur;
    9. while(pre.next!=null&&pre.next.next!=null) {
    10. int val=pre.next.val;
    11. if(pre.next.next.val==val) {
    12. while(pre.next!=null&&pre.next.next!=null&&pre.next.next.val==val) {
    13. pre.next=pre.next.next;
    14. }
    15. pre.next=pre.next.next;
    16. } else {
    17. pre=pre.next;
    18. }
    19. }
    20. return cur.next;
    21. }
    22. }

    代码重点注意:

    • 需要一个虚拟头节点,原因:如果第一个数就是重复数字,即头节点发生变化,并且无法确定,头节点需要往后移几个,所以采用虚拟头节点,使第一个数就是重复数字的这个特例就可以划分为普通情况了
    • 记录数值val,判断后一个数值是否相等,如果相等,则开始删除,否则,往后移一个节点,继续判断。
    • 为什么令pre.next.val等于val?原因:我们需要删除所有重复数字(一个不留),所以在删除节点时,我们需要使用该值所在节点的前一个结点,即需要给pre.next重新赋值的。
    • 删除时,我们无法确定有几个连续重复出现的数字,因此在if中嵌套了一个while循环,注意在循环中可能会出现空指针,因此需要加上限定判断其不为null
    • 删除时,我们每次只删除一个节点,当while(第二个)结束时,还残留了一个节点未删除,所以在while结束后,再删除一个节点。

    下期见!!! 

  • 相关阅读:
    (附源码)ssm在线学习网站 毕业设计 011451
    从零开始Apache2配置php服务并支持网页访问
    ElementUI组件-日期时间控件设置禁用日期
    import机制浅析
    Hbase安装和使用
    SQL触发器
    GDP-L-岩藻糖二钠盐,GDP-fucose ,6-Deoxy-β-L-galactopyranosylguanosine 5′-diphosphate
    Mysql: COMMIT 和 ROLLBACK
    基于tensorflow和NasNet的皮肤癌分类项目
    HarmonyOS应用开发者基础认证【满分答案】
  • 原文地址:https://blog.csdn.net/LYJbao/article/details/126197884