在数据结构中有很多面试题以及算法题,至于如何独自解决遇到的问题呢?
为了避免从这个问题引申的其他的问题,因此,有一个良好的解题思路就很关键了。
举个例子:
删除链表中等于给定值 val 的所有节点。
输入: 1->2->6->3->4->5->6, val = 6
输出: 1->2->3->4->5
在做题之前,审题很重要,其次,必须分析出所有可能出现的情况,以这道题为例,可能会出现哪种输入呢?
NULL
1->NULL,val=1
1->1->NULL,val=1
1->1->1->1->1->NULL,val=1
1->1->2->1->1->NULL,val=1
1->2->6->3->4->5->6->NULL, val = 6
尽可能的多的站在使用者的角度去想有多少种不同的输入
因为考虑的情况越多bug就越少,要么怎么会有版本1版本2的说法呢,就是因为版本1考虑的情况跟不上用户的使用,才产生了版本更新的说法。
列出了你能想到的所有情况之后,便可以写代码了
为了符合单链表空指针的情况
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* removeElements(struct ListNode* head, int val) {//此行以上都是题目中给的模板
if(head==NULL)
{
return NULL;//当为空链表时,返回NULL
}
}
为了符合{1->NULL,val=1}的情况,继续在代码块中添加代码
struct ListNode* removeElements(struct ListNode* head, int val) {
if(head==NULL)
{
return NULL;
}
if(head->val==val&&head->next==NULL)
{
return NULL;
}
}
再往下写便是{1->1->1->1->1->NULL,val=1}
struct ListNode* removeElements(struct ListNode* head, int val) {
if(head==NULL)
{
return NULL;
}
if(head->val==val&&head->next==NULL)
{
return NULL;
}
struct ListNode *cur=head;
if(head->val==val)
{
while(cur->val==val&&cur!=NULL)
{
if(cur->next==NULL)
{
return NULL;
}
cur=cur->next;
}
free(head);
head=cur;
}
return head;
}
接下来便是多数情况{1->2->6->3->4->5->6->NULL, val = 6}
struct ListNode* removeElements(struct ListNode* head, int val) {
if(head==NULL)//空链表
{
return NULL;
}
if(head->val==val&&head->next==NULL)//仅有一个节点,且其值为val
{
return NULL;
}
struct ListNode *cur=head;
struct ListNode *ptr=NULL;
if(head->val==val)//头结点值为val
{
while(cur->val==val&&cur!=NULL)
{
if(cur->next==NULL)
{
return NULL;
}
cur=cur->next;
}
free(head);
head=cur;
}
while(cur!=NULL)//大多数情况
{
if(cur->val==val)
{
ptr->next=cur->next;
free(cur);
cur=ptr->next;
}
else
{
ptr=cur;
cur=cur->next;
}
}
return head;
}
在写好之后,不要直接用电脑编译验证答案是否正确,用你一开始在用户角度思考的不同可能的输入,将每个输入代入程序,在程序中运行一次,如果觉得没有问题,再使用编译器进行编译。
如果编译器编译成功,且通过测试,你以为这道题结束了,然而并没有结束,思考一下优化,最优解!
在这个题中
1->1->NULL,val=1
1->1->1->1->1->NULL,val=1
这两个其实下面这个已经包含了上面的这个情况,所以
if(head->val==val&&head->next==NULL)
{
return NULL;
}
这段代码是多余的!