代码随想录day4 Java版

圣诞节🎅,但是得投暑期实习,被迫继续写链表题>_<

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

以循环第一次处理来分析,哨兵头节点指向2号,1号指向3号,2号指向1号。

在代码实现上就类似反转链表,需要用到3个指针

在这种指针很多的情况下,注意循环条件里面只放一个指针,在每次循环里面先设定指针,再进行操作。

最后用了哨兵节点记得返回dummy.next

class Solution {
    public ListNode swapPairs(ListNode head) {
        ListNode dummy = new ListNode(0,head);
        ListNode p = dummy, p1, p2;

        while(p.next != null && p.next.next != null) {
            // 移动指针
            p1 = p.next;
            p2 = p.next.next;
            // 哨兵头节点指向2号,1号指向3号,2号指向1号
            p.next = p2;
            p1.next = p2.next;
            p2.next = p1;
            // 移动指针
            p = p1;
           
        }
        return dummy.next;
    }
}

19.删除链表的倒数第N个节点

链表双指针,一般是快慢指针,快指针先走n步,然后快慢指针一起走,当快指针停下时慢指针就指向倒数第n个节点

class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode dummy = new ListNode(0,head);

        ListNode p1 = dummy, p2 = dummy;
        for (int i = 0; i < n; i++) {
            p1 = p1.next;
        }
        while (p1.next != null) {
            p1 = p1.next;
            p2 = p2.next;
        }
        p2.next = p2.next.next;
        return dummy.next;
    }
}

160.链表相交

一开始很迷,后面发现题目给的信息够多了,没什么需要自己想的

public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        int lengthA = 0, lengthB = 0;
        ListNode tempA =headA, tempB = headB;
        while(tempA!=null){
            tempA = tempA.next;
            lengthA++;
        }
        while(tempB!= null){
            tempB = tempB.next;
            lengthB++;
        }
        tempA = headA;
        tempB = headB;
        if(lengthA > lengthB){
            for(int i =0; i< lengthA-lengthB;i++){
                tempA = tempA.next;
            }
        }
        else if(lengthB > lengthA){
            for(int i =0; i< lengthB-lengthA;i++){
                tempB = tempB.next;
            }
        }
        while(tempA != tempB && tempA!=null &&tempB !=null){
            tempA = tempA.next;
            tempB = tempB.next;
        }
        return tempA;
    }
}

142.环形链表II

链表里的快慢指针,如果有环的话快慢指针一定会相遇

但这道题难度主要在于找到入环的第一个结点,看网上给的推导才勉强懂,太逆天了推出位置等于快慢指针相遇后走到入环点的距离

public class Solution {
    public ListNode detectCycle(ListNode head) {
        if (head == null) return null;

        ListNode p1 = head, p2 = head;
        ListNode p3 = head, p4;
        
        while(p2 != null && p2.next != null) {
            p1 = p1.next;
            p2 = p2.next.next;
            if (p1 == p2) {
                p4 = p1;
                while (p3 != p4) {
                    p3 = p3.next;
                    p4 = p4.next;
                }
                return p3;
            }
        }
        return null;
    }
}

ok到这里链表的题也刷完了,冲冲冲

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值