您现在的位置是:首页 >技术杂谈 >代码随想录算法训练营第三天|203.移除链表元素、707.设计链表、206.反转链表网站首页技术杂谈
代码随想录算法训练营第三天|203.移除链表元素、707.设计链表、206.反转链表
简介代码随想录算法训练营第三天|203.移除链表元素、707.设计链表、206.反转链表
一、203.移除链表元素
- 自己看到题目的第一想法
链表类型的题,一定要注意设置两样东西:1)设置虚拟头结点,2)一个指针cur
-
看完题解之后的想法
-
自己实现过程中遇到的问题总结
ListNode dummyhead = new ListNode();
默认是生成一个val是0,next是null的节点- cur指针移动条件(这个错好几回了!):当值相等的时候,移除元素;当值不相等时,cur指针再去向前移动。而不是每次循环都移动cur指针。
public class n203 {
public static void main(String[] args) {
ListNode listNode1 = new ListNode(1);
ListNode listNode2 = new ListNode(2);
ListNode listNode3 = new ListNode(6);
ListNode listNode4 = new ListNode(3);
ListNode listNode5 = new ListNode(4);
ListNode listNode6 = new ListNode(5);
ListNode listNode7 = new ListNode(6);
listNode1.next = listNode2;
listNode2.next = listNode3;
listNode3.next = listNode4;
listNode4.next = listNode5;
listNode5.next = listNode6;
listNode6.next = listNode7;
removeElements(listNode1,6);
}
public static ListNode removeElements(ListNode head, int val) {
ListNode dummyhead = new ListNode();//?
dummyhead.next = head;
ListNode cur = dummyhead;
while(cur.next!=null){
if(cur.next.val==val){
cur.next = cur.next.next;
} else {
cur = cur.next;
}
}
return dummyhead.next;
}
}
class ListNode{
int val;
ListNode next;
ListNode(){}
ListNode(int val){this.val = val;}
}
17分钟
二、707.设计链表
-
自己看到题目的第一想法
-
看完题解之后的想法
-
自己实现过程中遇到的问题总结
- get和remove的时候索引不能等于size,所以
if (index>=size){
- add的时候索引可以等于size,所以
if (index>size||size<0){
class MyLinkedList {
int size;
ListNode dummyhead;
public MyLinkedList() {
size = 0;
dummyhead = new ListNode();
}
public int get(int index) {
ListNode cur = dummyhead;
if (index>=size){
return -1;
}
for(int i = 0;i<index+1;i++){
cur = cur.next;
}
return cur.val;
}
public void addAtHead(int val) {
ListNode cur = dummyhead;
// ListNode temp = cur.next;
ListNode l1 = new ListNode(val);
l1.next = cur.next;
cur.next = l1;
size++;//!!
}
public void addAtTail(int val) {
ListNode cur = dummyhead;
while(cur.next!=null){
cur = cur.next;
}
cur.next = new ListNode(val);
size++;
}
public void addAtIndex(int index, int val) {
ListNode cur = dummyhead;
if (index>size||size<0){
return;
}
for(int i =0;i<index;i++){
cur = cur.next;
}
ListNode l1 = new ListNode(val);
l1.next = cur.next;
cur.next = l1;
size++;
}
public void deleteAtIndex(int index) {
ListNode cur = dummyhead;
if (index>=size||size<0){
return;
}
for(int i =0;i<index;i++){
cur = cur.next;
}
cur.next = cur.next.next;
size--;
}
}
class ListNode{
int val;
ListNode next;
ListNode(){}
ListNode(int val){this.val = val;}
}
26分钟
三、206.反转链表
- 自己看到题目的第一想法
- 使用pre,cur,temp三个指针
- 更新prev、cur位置时要注意
-
看完题解之后的想法
-
自己实现过程中遇到的问题总结
public ListNode reverseList(ListNode head) {
// ListNode dummyhead = new ListNode();
// dummyhead.next = head;
ListNode pre = null;
ListNode cur = head;
while(cur!=null){
ListNode temp = cur.next;
cur.next = pre;
//变到下一个
pre = cur;
cur = temp;
}
return pre;
}
22分钟
四、27.移除元素
-
自己看到题目的第一想法
-
看完题解之后的想法
-
自己实现过程中遇到的问题总结
总结
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。