链表相关oj
203. 移除链表元素 - 力扣(LeetCode)
看题解前:找到等于val的节点,然后修改这个节点的val值(等于下一个节点的val),因为已经到了cur的地方,对于cur的前一个节点没有保存,所以可以转化成删除cur的下一个节点的问题,cur->next=cur->next->next,需要注意的点就在于C++的内存是由成需要自己开辟和释放的,所以最好delete一下以防内存泄露。
看题解后:因为上述思路存在cur->next=cur->next->next,所以终止条件可以设置成cur不为空,且cur->next也不为空,这里的逻辑判断就需要有先后顺序了,一定要先判断cur,假设你先判断cur->next,当cur已经为空的时候,cur->next就直接是空指针的指向报错,我就是卡在这里很久,还呆呆的检查边界条件,最后才发现这个问题。
206. 反转链表 - 力扣(LeetCode)
看题解前:这个题思路还是比较简单,最开始的话想法就是对原来链表数据都创建成一个新节点,然后头插即可,但是这样有些浪费空间,因为反转也不是很困难,双指针prev和cur即可,把cur->=prev即可实现反转,不过还需要保留cur->next,cur才可以走到下一个
看题解后:最重要的就是理清楚逻辑关系吧,先保存cur->next,然后cur->next=prev,再然后prev=cur,最后再cur往后走,需要注意的点就在于cur最后是直接走到了nullptr的位置,所以返回的是cur的前一个位置,也就是prev。
707. 设计链表 - 力扣(LeetCode)
看题解前:链表的设计上一次应该还是在数据结构阶段了,很久没有上手实现过,所以也是各种报错,主要就是实现以下几种功能:
简单提一下我的思路吧:
get(index):获取指定位置val,直接for循环index次,找到返回->val,找不到返回-1;
addAtHead(val):头插,用val创建一个新的节点newnode,然后newnode->next=head,再把head=newnode即可;
addAtTail(val):尾插,定义一个tail=head,然后while一直tial=tail->next找到最后一个节点,用val创建一个新的节点newnode,tail–>next=newnode,newnode->next=nullptr即可;
addAtIndex(index,val):指定位置插入,跟尾插有异曲同工之妙,尾插直接找到尾,指定位置插入直接for循环index次,然后同样操作,不过需要用tmp保留index节点,然后newnode->next=tmp即可;
deleteAtIndex(index):删除指定位置,这个就跟最上面的移除链表元素一样,这里提供两种方案:
1、找到index的前一个节点记作cur,用tmp保留cur->next->next,然后cur->next=tmp,C++的话最后记得要释放掉节点空间。
2、找到index的节点记作cur,将该节点的val修改成下一个节点的val转化成删除下一个节点的位置,从而转化成第一类解决思路。
看题解后:不禁感叹,果然是一看就会,一写就废,各种空指针的问题,人有点麻,主要是处理边界问题和下标以及尾节点的删除问题。