代码随想录的文章和对应的题目链接:代码随想录
今天这三题我一开始都没有写出来,现在看完代码随想录,已经会写了,来看第一题,有两种方法,第一种方法就是在原链表上进行操作,也就是先判断head所指向的元素是不是目标元素,如果是的话,直接head=head->next即可,注意这里使用while循环的原因是如果出现这样的情况1,1,1,1,1,2要删除元素1,这样的话,这条语句就不止执行一次所以要用一个while循环,接着就是常规套路,但是注意while循环里要加上cur!=NULL因为当你上一个while结束后,head可能就是空了,所以要判断cur是不是空,具体代码如下
while(head!=NULL && head->val==val){
head=head->next;
}
ListNode* cur=head;
while(cur!=NULL && cur->next!=NULL){
if(cur->next->val==val){
cur->next=cur->next->next;
}
else cur=cur->next;
}
return head;
接着来看第二种方法,也就是虚拟头结点,先来看代码的实现
ListNode* cur=new ListNode;
cur->next=head;
ListNode* cur1=cur;
while(cur1->next!=NULL){
if(cur1->next->val==val){
cur1->next=cur1->next->next;
}
else cur1=cur1->next;
}
return cur->next;
这里在head之前定义了一个头结点,这样无论是对于头结点还是其他的结点,我们都可以用相同的操作来实现,后面就都是一样的,这就是第一题
题目链接/文章讲解/视频讲解::代码随想录
来看第二题,这一题我没写出来的原因不是因为我不会实现里面的函数。而是我没有搞懂里面的函数接口,搞得我有点混乱,其他的还是比较简单的,这里就不粘贴代码了,考虑边界条件,也就是index的值,其他的操作都比较简单,跳过
来看第三题https://programmercarl.com/0206.%E7%BF%BB%E8%BD%AC%E9%93%BE%E8%A1%A8.html
这道题可以用两种方法来写,第一种是双指针法,定义一个pre和cur指针,不断遍历元素,让cur指向pre,直到cur遍历完所有的元素,来看具体代码的实现
ListNode* pre=NULL;
ListNode* cur=head;
while(cur!=NULL){
ListNode* temp=cur->next;
cur->next=pre;
pre=cur;
cur=temp;
}
return pre;
很简单的思路
第二种方法是递归法
先写一个函数,传入两个指针,也就是pre和cur,然后再主函数里调用就行了,同样的当传入的cur指针指向空时,return pre ,不然就和上面一样的步骤,最后在主函数里返回结果就行了,来看具体代码的实现
ListNode* reverseList(ListNode* head) {
/*ListNode* pre=NULL;
ListNode* cur=head;
while(cur!=NULL){
ListNode* temp=cur->next;
cur->next=pre;
pre=cur;
cur=temp;
}
return pre;
*/
return Reverse(head,NULL);
}
ListNode* Reverse(ListNode* cur, ListNode* pre){
if(cur==NULL) return pre;
ListNode* t=cur->next;
cur->next=pre;
pre=cur;
cur=t;
return Reverse(cur,pre);
}
这就是今天的博客,第二题没有太过讲,因为没有涉及到一些重要的方法,就是一些基础操作,我会继续加油,不断前进!