代码随想录代码训练营第3天
leetcode| 203.移除链表元素 | 707.设计链表 | 206.反转链表
学习文章链接
链表相关知识
203.移除链表元素
203移除链表元素
看到题的思路
要删除链表的元素,对于链表来说最重要的是找到它的前一个节点,然后把链表的指针指到后面的后面的那个节点上。
那如果删除整个链表的第一个元素那么则需要有一个虚拟的头节点。
代码
/**
* 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) {
ListNode a=new ListNode(0,head);
ListNode i=a;
while(i.next!=null)
{
if(i.next.val==val)
{
i.next=i.next.next;
}
else
i=i.next;
}
return a.next;
}
}
707.设计链表
707 设计链表
看到题的思路
这个题比较综合,涉及了链表的一些常规操作。
代码
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 j=head;
for(int i=0;i<=index;i++)
j=j.next;
return j.val;
}
public void addAtHead(int val) {
ListNode i=head;
ListNode t=new ListNode(val);
t.next=i.next;
i.next=t;
size++;
}
public void addAtTail(int val) {
ListNode j=head;
ListNode t=new ListNode(val);
for(int i=0;i<size;i++)
j=j.next;
j.next=t;
t.next=null;
size++;
}
public void addAtIndex(int index, int val) {
if(index<=size)
{
ListNode j=head;
ListNode t=new ListNode(val);
for(int i=0;i<index;i++)
{
j=j.next;
}
t.next=j.next;
j.next=t;
size++;
} }
public void deleteAtIndex(int index) {
if(index<size)
{
ListNode j=head;
for(int i=0;i<index;i++)
{
j=j.next;
}
j.next=j.next.next;
size--;
}
}
}
class ListNode{
int val;
ListNode next;
public ListNode(int val)
{
this.val=val;
}
}
/**
* Your MyLinkedList object will be instantiated and called as such:
* MyLinkedList obj = new MyLinkedList();
* int param_1 = obj.get(index);
* obj.addAtHead(val);
* obj.addAtTail(val);
* obj.addAtIndex(index,val);
* obj.deleteAtIndex(index);
*/
206.反转链表
206.反转链表
看到题的思路
想到是头插法,头插法刚好可以实现链表的反转。
但是看题解掌握了双指针法。
/**
* 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 temp=new ListNode(0);
ListNode old=head;
while(old!=null)
{
ListNode t=old;
old=old.next;
t.next=temp.next;
temp.next=t;
}
return temp.next;
}
}
/**
* 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 pre=null;
ListNode t=head;
ListNode temp=t;
while(t!=null)
{
temp=t.next;
t.next=pre;
pre=t;
t=temp;
}
return pre;
}
}
反思
链表最重要的我感觉是要清晰的判断指针的指向。链表这里还是要多练,明显感觉写的时候大脑宕机。不是很熟悉