一、203.移除链表元素
学习链接:移除链表元素
状态:做出来了
细节之处:1 2(代码里面)
思路:添加虚拟头节点,利用pre(前节点),cur(当前节点),只要cur.val=val,pre的指针就指向cur.next,达到删除元素的目的。
class Solution {
public ListNode removeElements(ListNode head, int val) {
if(head==null)return head;
ListNode dummy=new ListNode(-1,head);
ListNode pre=dummy; //1 虚拟头结点,使头节点不需要做特别处理
ListNode cur=head;
while(cur!=null)
{
if(cur.val==val){
pre.next=cur.next;
}else {
pre=cur;
}
cur=cur.next;
}
return dummy.next; //2 除去刚才的虚拟头节点
}
}
二、707.设计链表
学习链接:设计链表
状态:做出来了
细节之处:1 2 3 4 5 6(代码里面)
思路:利用虚拟头节点的方式,使得删除和添加操作时候不需要对头节点进行特别处理,添加首尾元素可以靠添加函数实现,整体要注意size和index,size是实际链表元素的数量(不包含虚拟头节点),而如果从头节点开始遍历,index其实就相当于index-1。
class ListNode{
int val;
ListNode next;
ListNode(){}
ListNode(int val)
{
this.val=val;
}
}
class MyLinkedList {
int size;
ListNode head;
public MyLinkedList() {
this.size = 0; //1 初始size为0,不加虚拟头节点的数量
this.head = new ListNode(0); //2 虚拟头节点
}
public int get(int index) {
if(index < 0 || index > size-1)return -1;
ListNode currentNode = head;
for(int i = 0; i <= index; i++) //3 因为从虚拟头节点开始,所以访问的下表是index+1
{
currentNode = currentNode.next;
}
return currentNode.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<0)return;
if(index>size)return; //4 index=size的时候是添加到末尾,这里的size没有算进虚拟头节点
size++;
ListNode pre=head;
for(int i=0;i<index;i++) //5 因为有虚拟头节点,这个循环遍历到了index-1(即前节点)来添加元素
{
pre=pre.next;
}
ListNode newlistnode=new ListNode(val);
newlistnode.next=pre.next;
pre.next=newlistnode;
}
public void deleteAtIndex(int index) {
if(index<0)return;
if(index>=size)return;
size--;
ListNode pre=head;
for(int i=0;i<index;i++) //6 同上,遍历到前节点来删除元素
{
pre=pre.next;
}
pre.next=pre.next.next;
}
}
三、206.反转链表
学习链接:反转链表
状态:没做出来,踩坑了
细节之处:1 2 3(代码里面)
思路:利用pre和cur存储前节点和现在节点,temp存储下一个节点,一步步修改指针,使链表能够翻转,这道题目我的解法有个坑没有注意到,首节点的next没有进行处理,导致出现了循环链表,边界还是要着重考虑。
class Solution {
public ListNode reverseList(ListNode head) {
if(head==null||head.next==null) return head;
ListNode pre=head;
ListNode cur=head.next;
head.next=null; //1 踩坑 下面的循环并没有处理首节点,
while(cur!=null)
{
ListNode temp=cur.next; //2 存储下一个节点
cur.next=pre;
pre=cur;
cur=temp;
}
return pre; //3 因为cur=null,所以pre是最后一个节点,相当于反转链表的首节点
}
}