前言
在学完了顺序表的基本知识后,我们可以通过一些习题来巩固所学知识!
习题1:
删除链表中等于给定值 val 的所有结点。oj链接
这道题目有两种做法:
方法一:双指针的遍历,通过双指针来查找删除节点并连接后面的节点,但是缺点就是会有特殊情况需要考虑(头删的情况),代码如下:
方法2:通过遍历,将节点尾插到新链表,最后返回新链表,代码如下:
struct ListNode* removeElements(struct ListNode* head, int val) { struct ListNode*cur=head,*newnode=NULL,*tail=NULL; while(cur) { if(cur->val!=val) { if(newnode==NULL) { newnode=cur; tail=cur; } else { tail->next=cur; tail=tail->next; } cur=cur->next; } else { struct ListNode*next=cur; cur=next->next; free(next); } } if(tail) { tail->next=NULL; } return newnode; }
习题2
反转一个单链表。oj链接
这道题也有两种方法,
方法1:用三指针的方法,前两个来改变每个节点的链接关系,最后一个节点用来标记位置方便遍历链表
代码如下:
方法2:取每个节点头插到新链表: