203.移除链表元素
思路:
1.删除一个元素后,不用移动遍历指针,只有没找到目标数值时再往后移动指针。
2.删除链表元素必须找到被删除元素的前一个元素才能完成删除,因此删除头节点时,可以通过借助虚拟头节点来完成;另外,当遍历到链表最后一个元素(即:
p->next==NULL)时,就可以退出遍历了。
struct ListNode* removeElements(struct ListNode* head, int val){
struct ListNode *dummy=malloc(sizeof(struct ListNode));
dummy->next=head;
struct ListNode *p=dummy;
struct ListNode *t=NULL;
while(p->next){
if(p->next->val==val){
p->next=p->next->next;
}
else
p=p->next;
}
return dummy->next;
}
206.反转链表
思路一:双指针法
cur 指向当前要被反转的节点,pre 指向前一个结点,反转完一个结点两节点同时向前移动一位,直到 pre 指向尾节点 cur 指向NULL。
反转之后的头结点,head->next指向NULL,因此pre初始化为NULL
struct ListNode* reverseList(struct ListNode* head){
struct ListNode *cur=head;
struct ListNode *pre=NULL;
struct ListNode *temp=NULL;
while(cur){
temp=cur->next;
cur->next=pre;
pre=cur;
cur=temp;
}
return pre;
}
2.递归法
思路:终止条件:cur=NULL,此时返回反转后链表的头节点 pre
递归过程中执行反转操作,然后返回递归函数
struct ListNode *reverse(struct ListNode *cur,struct ListNode *pre){
if(!cur)
return pre;
struct ListNode *temp=cur->next;
cur->next=pre;
return reverse(temp,cur);
}
struct ListNode* reverseList(struct ListNode* head){
return reverse(head,NULL);
}
第一次写递归的方法
707