有经验的企业做网站,开网店 建网站要钱吗,网站建设开发计划,外链链接平台以下刷题思路来自代码随想录以及官方题解 文章目录 203.移除链表元素707.设计链表206.反转链表24.两两交换链表中的节点19.删除链表的倒数第N个节点面试题 02.07. 链表相交142.环形链表II 203.移除链表元素
给你一个链表的头节点 head 和一个整数 val #xff0c;请你删除链…以下刷题思路来自代码随想录以及官方题解 文章目录 203.移除链表元素707.设计链表206.反转链表24.两两交换链表中的节点19.删除链表的倒数第N个节点面试题 02.07. 链表相交142.环形链表II 203.移除链表元素
给你一个链表的头节点 head 和一个整数 val 请你删除链表中所有满足 Node.val val 的节点并返回新的头节点 。
输入head [1,2,6,3,4,5,6], val 6
输出[1,2,3,4,5]输入head [], val 1
输出[]输入head [7,7,7,7], val 7
输出[]/*** 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 removeElements(ListNode head, int val) {//首先解决头节点不为空为val的情况while (head ! null head.val val) {head head.next;}// 如果头节点为空if (head null) {return head;}ListNode pre head;ListNode cur head.next;while (cur ! null) {// 判断值相等if (cur.val val) {pre.next cur.next;} else {pre cur;}cur cur.next;}return head;}
}707.设计链表
你可以选择使用单链表或者双链表设计并实现自己的链表。
单链表中的节点应该具备两个属性val和next 。val 是当前节点的值next 是指向下一个节点的指针/引用。
如果是双向链表则还需要属性 prev 以指示链表中的上一个节点。假设链表中的所有节点下标从 0 开始。
实现 MyLinkedList 类
MyLinkedList() 初始化 MyLinkedList 对象。 int get(int index) 获取链表中下标为 index 的节点的值。如果下标无效则返回 -1 。 void addAtHead(int val) 将一个值为 val 的节点插入到链表中第一个元素之前。在插入完成后新节点会成为链表的第一个节点。 void addAtTail(int val) 将一个值为 val 的节点追加到链表中作为链表的最后一个元素。 void addAtIndex(int index, int val) 将一个值为 val 的节点插入到链表中下标为index 的节点之前。如果 index 等于链表的长度那么该节点会被追加到链表的末尾。如果 index 比长度更大该节点将 不会插入 到链表中。 void deleteAtIndex(int index) 如果下标有效则删除链表中下标为 index 的节点。
输入
[MyLinkedList, addAtHead, addAtTail, addAtIndex, get, deleteAtIndex, get]
[[], [1], [3], [1, 2], [1], [1], [1]]
输出
[null, null, null, null, 2, null, 3]解释
MyLinkedList myLinkedList new MyLinkedList();
myLinkedList.addAtHead(1);
myLinkedList.addAtTail(3);
myLinkedList.addAtIndex(1, 2); // 链表变为 1-2-3
myLinkedList.get(1); // 返回 2
myLinkedList.deleteAtIndex(1); // 现在链表变为 1-3
myLinkedList.get(1); // 返回 3public class ListNode {int val;ListNode next;ListNode() {}ListNode(int val) {this.val val;}
}class MyLinkedList {// 存储链表中节点个数int size;// 虚拟头节点ListNode head;public MyLinkedList() {size 0;head new ListNode(0);}public int get(int index) {if (index 0 || index size) {return -1;}ListNode cur head;// 直接遍历到该结点for (int i 0; i index; i) {cur cur.next;}return cur.val;}public void addAtHead(int val) {addAtIndex(0, val);}public void addAtTail(int val) {addAtIndex(size, val);}public void addAtIndex(int index, int val) {if (index size) {return;}if (index 0) {index 0;}// 因为需要插入所以sizesize;// 因为是单链表所以需要找到插入位置的前节点ListNode pre head;for (int i 0; i index; i) {pre pre.next;}ListNode newNode new ListNode(val);// 这里顺序至关重要newNode.next pre.next;pre.next newNode;}public void deleteAtIndex(int index) {if (index 0 || index size) {return;}size--;if (index 0) {head head.next;return;}ListNode pre head;for (int i 0; i index; i) {pre pre.next;}pre.next pre.next.next;}
}206.反转链表
给你单链表的头节点 head 请你反转链表并返回反转后的链表。
输入head [1,2,3,4,5]
输出[5,4,3,2,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 reverseList(ListNode head) {ListNode preNode null;ListNode curNode head;ListNode temp null;while(curNode ! null){//暂存下一个节点temp curNode.next;//反转箭头curNode.next preNode;preNode curNode;curNode temp;}return preNode;}
}24.两两交换链表中的节点
给你一个链表两两交换其中相邻的节点并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题即只能进行节点交换。
输入head [1,2,3,4]
输出[2,1,4,3]输入head []
输出[]输入head [1]
输出[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 swapPairs(ListNode head) {if(head null || head.next null){return head;}// 获取当前节点的下一个节点ListNode next head.next;// 进行递归ListNode newNode swapPairs(next.next);// 这里进行交换next.next head;head.next newNode;return next;}
}19.删除链表的倒数第N个节点
给你一个链表删除链表的倒数第 n 个结点并且返回链表的头结点。
输入head [1,2,3,4,5], n 2
输出[1,2,3,5]输入head [1], n 1
输出[]输入head [1,2], n 1
输出[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) {// 创建一个虚拟头节点pre将其next指针指向headListNode pre new ListNode(0);pre.next head;// 定义两个指针start和end都指向preListNode start pre, end pre;// 将start指针向前移动n个节点即start和end之间相隔n个节点while(n ! 0) {start start.next;n--;}// 同时移动start和end指针直到start指向最后一个节点while(start.next ! null) {start start.next;end end.next;}// 删除倒数第n个节点即将end的next指针指向end.next.nextend.next end.next.next;// 返回删除节点后的链表头节点return pre.next;}
}
下面是力扣官方题解真的通俗移动膜拜
class Solution {public ListNode removeNthFromEnd(ListNode head, int n) {ListNode dummy new ListNode(0, head);int length getLength(head);ListNode cur dummy;for (int i 1; i length - n 1; i) {cur cur.next;}cur.next cur.next.next;ListNode ans dummy.next;return ans;}public int getLength(ListNode head) {int length 0;while (head ! null) {length;head head.next;}return length;}
}
面试题 02.07. 链表相交
给你两个单链表的头节点 headA 和 headB 请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点返回 null 。 输入intersectVal 8, listA [4,1,8,4,5], listB [5,0,1,8,4,5], skipA 2, skipB 3
输出Intersected at 8
解释相交节点的值为 8 注意如果两个链表相交则不能为 0。
从各自的表头开始算起链表 A 为 [4,1,8,4,5]链表 B 为 [5,0,1,8,4,5]。
在 A 中相交节点前有 2 个节点在 B 中相交节点前有 3 个节点。输入intersectVal 2, listA [0,9,1,2,4], listB [3,2,4], skipA 3, skipB 1
输出Intersected at 2
解释相交节点的值为 2 注意如果两个链表相交则不能为 0。
从各自的表头开始算起链表 A 为 [0,9,1,2,4]链表 B 为 [3,2,4]。
在 A 中相交节点前有 3 个节点在 B 中相交节点前有 1 个节点。输入intersectVal 0, listA [2,6,4], listB [1,5], skipA 3, skipB 2
输出null
解释从各自的表头开始算起链表 A 为 [2,6,4]链表 B 为 [1,5]。
由于这两个链表不相交所以 intersectVal 必须为 0而 skipA 和 skipB 可以是任意值。
这两个链表不相交因此返回 null 。对于这道题同样使用哈希表来解决。
/*** 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) {//HashSet是一个没有重复元素的集合SetListNode set new HashSetListNode();ListNode temp headA;while(temp ! null){set.add(temp);temp temp.next;}temp headB;while(temp!null){if(set.contains(temp)){return temp;}temp temp.next;}return null;}
}142.环形链表II
给定一个链表返回链表开始入环的第一个节点。 如果链表无环则返回 null。
输入head [3,2,0,-4], pos 1
输出返回索引为 1 的链表节点
解释链表中有一个环其尾部连接到第二个节点。输入head [1,2], pos 0
输出返回索引为 0 的链表节点
解释链表中有一个环其尾部连接到第一个节点。输入head [1], pos -1
输出返回 null
解释链表中没有环。我们遍历链表中的每个节点并将它记录下来一旦遇到了此前遍历过的节点就可以判定链表中存在环。借助哈希表可以很方便地实现。
/*** 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) {SetListNode set new HashSet();while (head ! null) {if (set.contains(head)) {return head;} else {set.add(head);}head head.next;}return null;}
}