代码随想录第四天|24. Swap Nodes in Pairs、19. Remove Nth Node From End of List、160. Intersection of Two Link

#Java、#链表、#双指针、#哈希表

一、今日学习链接

        1、24. Swap Nodes in Pairs,文章链接,视频链接

        2、19. Remove Nth Node From End of List,文章链接,视频链接

        3、160. Intersection of Two Linked Lists,文章链接

        4、142. Linked List Cycle II,文章链接,视频链接

二 、理论知识

三、解题思路

题号思路相关主题难度
24. Swap Nodes in Pairs

dummy, dummy.next = head, cur = dummy

while(cur.next != null && cur.next.next != null)(偶数个数、奇数个数,理解什么时候为空)

操作节点在被操作的两两节点之前

记录cue.next, cur.next.next.next(例如第三个节点)

技巧:画图演示,一目了然

链表

两两交换

medium
19. Remove Nth Node From End of List

方法一:helper method

此题可以用上我们昨天学习的反转链表和删除链表元素,反转后n是正序,指针落在第n个节点之前,删除第n个节点即可,最后再反转过来

方法二:双指针

双指针的经典应用,如果要删除倒数第n个节点,让fast移动n步,然后让fast和slow同时移动,直到fast指向链表末尾。删掉slow所指向的节点就可以了。->fast移动n+1步,fast、slow再同时移动,当fast为空,slow会停在被删除节点之前。

链表

反转链表

删除链表元素

双指针

medium
160. Intersection of Two Linked Lists

方法一:HashSet

方法二:快慢指针

链表

哈希表(set)

easy
142. Linked List Cycle IIHashSet

链表

哈希表(set)

medium
//19.删除链表的倒数第N个节点
//helper method,反转链表->删除第n个节点->再反转回来
class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode reversed = reverse(head);
        ListNode dummy = new ListNode(0);
        ListNode prev = dummy;
        dummy.next = reversed;
        ListNode cur = reversed;
        int i=1;
        while(i<n) {
            prev = cur;
            cur = cur.next;
            i++;
        }
        prev.next = cur.next;
        ListNode res = reverse(dummy.next);
        return res;
    }
    public ListNode reverse(ListNode head) {
        ListNode prev = null;
        ListNode cur = head;
        while (cur != null) {
            ListNode temp = cur.next;
            cur.next = prev;
            prev = cur;
            cur = temp;
        }
        return prev;
    }
}
//19.删除链表的倒数第N个节点
//双指针:快慢指针解法
class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode dummy = new ListNode(0);
        dummy.next = head;
        ListNode fast = dummy;
        ListNode slow = dummy;
        n++;
        while (n-->0 && fast != null) {
            fast = fast.next;
        }
        while (fast != null) {
            fast = fast.next;
            slow = slow.next;
        }
        slow.next = slow.next.next;
        return dummy.next;
    }
}

四、总结        

       链表问题,比如24. Swap Nodes in Pairs,指针移动有先后顺序,可以画图来模拟指针移动,否则操作多个指针容易乱。L24非常考察链表基础的一题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值