网站建设公司哪家好 都来磐石网络廊坊seo扣费

当前位置: 首页 > news >正文

网站建设公司哪家好 都来磐石网络,廊坊seo扣费,做公众号主页面的有哪些网站,设计类型的网站目录

  1. 环形链表 解题思路
  2. 环形链表 II 解题思路
  3. 删除排序链表中的重复元素 解题思路
  4. 删除排序链表中的重复元素 II 解题思路
  5. 移除链表元素 解题思路
  6. 链表的中间结点 解题思路 1. 环形链表 OJ#xff1a;环形链表 给你一个链表的头节点 head 环形链表 给你一个链表的头节点 head 判断链表中是否有环。 如果链表中有某个节点可以通过连续跟踪 next 指针再次到达则链表中存在环。 为了表示给定链表中的环评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置索引从 0 开始。注意pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。 如果链表中存在环 则返回 true 。 否则返回 false 。 示例 1 输入head [3,2,0,-4], pos 1 输出true 解释链表中有一个环其尾部连接到第二个节点。 解题思路 快慢指针 快指针走两步慢指针走一步如果链表带环两个最终肯定会在环内相遇如果链表不带环快指针肯定会走到链表的末尾 public boolean hasCycle(ListNode head) {if(head null || head.next null){return false;}ListNode low head;ListNode fast head;while(fast ! null fast.next ! null){fast fast.next.next;low low.next;if(fast low){return true;}}return false;} 2. 环形链表 II OJ环形链表 II 给定一个链表的头节点  head 返回链表开始入环的第一个节点。 如果链表无环则返回 null。 如果链表中有某个节点可以通过连续跟踪 next 指针再次到达则链表中存在环。 为了表示给定链表中的环评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置索引从 0 开始。如果 pos 是 -1则在该链表中没有环。注意pos 不作为参数进行传递仅仅是为了标识链表的实际情况。 不允许修改 链表。 示例 1 输入head [3,2,0,-4], pos 1 输出返回索引为 1 的链表节点 解释链表中有一个环其尾部连接到第二个节点。 示例 2 输入head [1,2], pos 0 输出返回索引为 0 的链表节点 解释链表中有一个环其尾部连接到第一个节点。 示例 3 输入head [1], pos -1 输出返回 null 解释链表中没有环。 解题思路 public ListNode detectCycle(ListNode head) { // 快慢指针相遇时引入新节点从链表头开始慢的一定会和新节点在环形第一个节点相遇ListNode low head;ListNode fast head;while (fast ! null fast.next ! null){low low.next;fast fast.next.next;if(fast low){ListNode third head;while (third ! low){third third.next;low low.next;}return low;}}return null;} 3. 删除排序链表中的重复元素 OJ删除排序链表中的重复元素 给定一个已排序的链表的头 head  删除所有重复的元素使每个元素只出现一次 。返回 已排序的链表 。 示例 1 输入head [1,1,2] 输出[1,2] 示例 2 输入head [1,1,2,3,3] 输出[1,2,3] 解题思路 思路1由于给定的链表是排好序的因此重复的元素在链表中出现的位置是连续的因此我们只需要对链表进行一次遍历就可以删除重复的元素。当cur与cur.next的元素相等时删除cur.next。下面给出了两种实现方法。   public ListNode deleteDuplicates(ListNode head) { if(head null || head.next null){return head;} // 至少有两个节点 // 头节点val在范围之外if (head null) {return head;}ListNode cur head;while (cur.next ! null) {if (cur.val cur.next.val) {cur.next cur.next.next;} else {cur cur.next;}}return head;} public ListNode deleteDuplicates(ListNode head) {if(head null ||head.next null){return null;}head deleteDuplicates(head.next);return head.val head.next.val ? head.next : head;} 4. 删除排序链表中的重复元素 II OJ删除排序链表中的重复元素 II 给定一个已排序的链表的头 head  删除原始链表中所有重复数字的节点只留下不同的数字 。返回 已排序的链表 。 示例 1 输入head [1,2,3,3,4,4,5] 输出[1,2,5] 示例 2 输入head [1,1,1,2,3] 输出[2,3] 解题思路 public ListNode deleteDuplicates(ListNode head) {// 1.base caseif (head null || head.next null) {return head;}ListNode dummyHead new ListNode(-101);dummyHead.next head;ListNode prev dummyHead;ListNode cur prev.next;while (cur ! null) {ListNode sec cur.next;if (sec null) {break;}if (cur.val ! sec.val) {prev prev.next;}else {// 此时cur和sec相等while (sec ! null cur.val sec.val) {sec sec.next;}// 此时sec一定走到第一个和cur不相等的结点// prev .. sec全都是待删除的结点prev.next sec;}cur sec;}return dummyHead.next;} //递归法// 传入一个以head为头节点的链表就能删除其中所有的重复元素重复元素一个都不保留public ListNode deleteDuplicates(ListNode head) {// 1.base caseif(head null || head.next null) {return head;}if(head.val ! head.next.val) {head.next deleteDuplicates(head.next);return head;}else {// 头节点就是重复的节点先处理完头节点的情况ListNode newHead head.next;while(newHead ! null newHead.val head.val) {newHead newHead.next;}// 此时newHead一定不是待删除的结点最终整个传入函数返回更新后的值即可return deleteDuplicates(newHead);}} 5. 移除链表元素 OJ移除链表元素 给你一个链表的头节点 head 和一个整数 val 请你删除链表中所有满足 Node.val val 的节点并返回 新的头节点 。 示例 1 输入head [1,2,6,3,4,5,6], val 6 输出[1,2,3,4,5] 示例 2 输入head [], val 1 输出[] 示例 3 输入head [7,7,7,7], val 7 输出[] 解题思路 1先判断头节点元素是否与val相等相等删除头节点head head.next 2判断后面的节点元素是否与val相等相等删除prev.next prev.next.next;不相等往下继续遍历。直至到链表尾部。 public ListNode removeElements(ListNode head, int val) {while (head ! null head.val val) {head head.next;}// 有头节点的链表解法ListNode dummyHead new ListNode();//与原链表建立联系dummyHead.next head;ListNode prev dummyHead;while(prev.next ! null){if(prev.next.val val){prev.next prev.next.next;}else{prev prev.next;}}return dummyHead.next;} public ListNode removeElements(ListNode head, int vals) {if(head null){return null;}head.next removeElements(head.next,vals);return head.val vals ? head.next :head;} 6. 链表的中间结点 给你单链表的头结点 head 请你找出并返回链表的中间结点。 如果有两个中间结点则返回第二个中间结点。 示例 1 输入head [1,2,3,4,5] 输出[3,4,5] 解释链表只有一个中间结点值为 3 。 示例 2 输入head [1,2,3,4,5,6] 输出[4,5,6] 解释该链表有两个中间结点值分别为 3 和 4 返回第二个结点。 解题思路 思路1快慢指针慢指针走一步快指针走两步当快指针走到链表最后一个或走到空时慢指针走到中间节点。 public ListNode middleNode(ListNode head) {ListNode fast head;ListNode low head;while (fast! null fast.next ! null){low low.next;fast fast.next.next;}return low;} 思路2先求出链表长度再除以2就是中间节点的位置了从链表头遍历到该位置再返回。 public ListNode middleNode(ListNode head) {int length 0;ListNode node head;while(node ! null){length;node node.next;}length length / 2;node head;for(int i 0;ilength;i){node node.next;}return node;}