代码随想录 Day03
203.移除链表元素
1. 虚拟节点法(设置一个虚拟头结点再进行删除操作)
- 常规法(直接在原有链表上操作)
707.设计链表
leetcode题目链接
这个题目的重点
1.要知道操作节点的前一个节点的指针才能进行插入/删除的操作。
2.插入时先更新右边的链 再更新左边的链。
// 自己写一个单链表的全流程
class ListNode{ //注意类的写法 类名称后面是没有()的
int val;
ListNode next;
public ListNode(){}
public ListNode(int val){
this.val=val;
}
}
class MyLinkedList {
int size;//整个链表的大小 则有效的索引范围是0-size-1;
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循环是为了是cur移动到要操作节点的位置
for(int i=0;i<=index;i++){// for循环中初始化时不要忘记写类型定义
cur=cur.next;
}
return cur.val;
}
public void addAtHead(int val) {
ListNode cur=head;
ListNode newNode=new ListNode(val);
newNode.next=cur.next;
cur.next=newNode;
size++;
}
public void addAtTail(int val) {
ListNode cur=head;
while(cur.next!=null){
cur=cur.next;
}
ListNode newNode=new ListNode(val);
cur.next=newNode;
size++;
}
public void addAtIndex(int index, int val) {
if(index<0){
addAtHead(val);
}else if (index>=0&&index<size){
ListNode cur=head;
for(int i=0;i<index;i++){
cur=cur.next;
}
ListNode newNode=new ListNode(val);
newNode.next=cur.next;
cur.next=newNode;
size++;
} else if(index==size){
addAtTail(val);
}
}
public void deleteAtIndex(int index) {
ListNode cur=head;
if(index>=0&&index<size){
for(int i=0;i<index;i++){
cur=cur.next;
}
cur.next=cur.next.next;
size--;
}
}
}
206.反转链表
题意:反转一个单链表。
示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL
class Solution {
public ListNode reverseList(ListNode head) {
//先写一个双指针的写法
// ListNode cur=head;
// ListNode pre=null;
// while(cur!=null){
// ListNode tem=cur.next;//是为了cur的移动做准备
// cur.next=pre;
// pre=cur;//先存值 后改向 再移动
// cur=tem;
// }
// return pre;
return reverse(head,null);}
// 再写一个递归的写法
ListNode reverse(ListNode cur,ListNode pre){
if(cur==null){
return pre;
}
ListNode tem=cur.next;//是为了cur的移动做准备
cur.next=pre;
return reverse(tem,cur);//注意递归的时候都要return 函数
}
}
注意:一定是断了链之后①的位置就无法确定了 在前几天的删除、增加链表元素时,利用先右后左的方式会避免先断链(但本题中先保存位置,思维上就会简单很多,就可以正常按照画图顺序操作了)