代码随想录算法训练营第4天|两两交换、删倒n、链表相交、环链

lc24两两交换链表中的节点

思路

模拟大法,注意dummy是主线,cur只是dummy完成任务的分身

代码

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode swapPairs(ListNode head) {
        ListNode dummy = new ListNode(-1, head);
        ListNode cur = dummy;
        while (cur.next != null && cur.next.next != null){
            ListNode left = cur.next;
            ListNode right = cur.next.next;
            ListNode nextNode = right.next;
            cur.next = right;
            right.next = left;
            left.next = nextNode;
            cur = left;
        }
        return dummy.next;
    }
}

lc19删除链表中倒数第n节点

思路

双指针法,快指针先走n+1,和慢指针同时移动,注意空指针被赋值

代码

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode dummy = new ListNode(-1, head);
        ListNode slow = dummy, fast = dummy;
        for (int i = 0; i <= n; i++){
            fast = fast.next;
        }
        while (fast != null){
            slow = slow.next;
            fast = fast.next;
        }
        if (slow.next != null){
            slow.next = slow.next.next;
        }
        return dummy.next;
    }
}

lc160链表相交

思路

统计两链表长度,并假设A是较长的,不可以破坏原头节点。跳过A的gap节点同时移动,寻找相交节点。

代码

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        int lenA = 0, lenB = 0, gap = 0;
        ListNode curA = headA, curB = headB;
        while (curA != null) {
            curA = curA.next;
            lenA++;
        }
        while (curB != null) {
            curB = curB.next;
            lenB++;
        }
        curA = headA;
        curB = headB;
        if (lenA < lenB){
            gap = lenB - lenA;
            ListNode temp = curA;
            curA = curB;
            curB = temp;
            int temLen = lenA;
            lenA = lenB;
            lenB = temLen;
        }
        gap = lenA - lenB;
        while (gap-- > 0){
            curA = curA.next;
        }
        for (int i = 0; i < lenB; i++){
            if (curA == curB){
                return curA;
            }
            curA = curA.next;
            curB = curB.next;
        }
        return null;
    }
}

lc142环形链表II

思路

双指针法,快慢指针同时出发;有环根据数学推理找到入口节点

代码

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public ListNode detectCycle(ListNode head) {
        ListNode slow = head, fast = head;
        while (fast != null && fast.next != null){
            fast = fast.next.next;
            slow = slow.next;
            if (slow == fast){
                fast = head;
                while (fast != slow){
                    fast = fast.next;
                    slow = slow.next;
                }
                return slow;
            }
        }
        return null;
    }
}

全部评论

相关推荐

10-09 09:00
门头沟学院 Java
有没有佬已经面了的?分享一下
谭笑a:面完了,以为会有很多八股,结果全是实习、项目。但是面试官人很好,像跟同学聊天一样。
点赞 评论 收藏
分享
XSS(跨站脚本攻击)指的是攻击者通过注入恶意脚本代码来攻击用户的网站或应用程序。攻击者通常会在用户输入的内容中注入脚本代码或恶意链接,并使其他用户在浏览该网页时执行该代码,从而窃取用户信息、篡改页面内容或进行其他恶意行为。为了防止&nbsp;XSS&nbsp;攻击,可以采取以下措施:https://www.nowcoder.com/issue/tutorial?zhuanlanId=Mg58Em&amp;amp;uuid=bb7c8339fae245258616366baf13e19e输入验证和过滤:对用户输入的数据进行验证和过滤,确保只接受符合预期格式和内容的数据。可以使用合适的库或框架进行输入验证,如限制特殊字符、转义特殊字符等。输出编码:在将用户输入内容(包括用户输入的文本、URL&nbsp;或&nbsp;HTML)输出到页面时,将其进行合适的编码处理,以防止脚本代码被解析执行。常用的编码方式有&nbsp;HTML&nbsp;实体编码和&nbsp;URL&nbsp;编码。使用&nbsp;HTTP-only&nbsp;Cookie:将敏感信息(如用户身份验证的&nbsp;Cookie)标记为&nbsp;HTTP-only,这样脚本无法通过&nbsp;JavaScript&nbsp;访问该&nbsp;Cookie,减少&nbsp;XSS&nbsp;攻击的威力。使用内容安全策略(CSP):通过配置内容安全策略,限制页面加载资源的来源,只加载可信的资源,以防止恶意脚本的注入。定期更新和维护:及时更新和修复应用程序的漏洞和安全问题,以提高应用程序的安全性。教育用户:提高用户的安全意识,教育用户不要轻信可疑的链接或提供个人敏感信息,从而降低受到&nbsp;XSS&nbsp;攻击的风险。
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务