链表OJ题对于我现阶段的学习确实存在这一些难度,对题目里所蕴含的知识也是很浅,但我愿意分享我的一些理解,记录我的学习过程,也时常以博客来反省自己,提醒自己。
后续我会根据自己的学习情况补充OJ题思路和解法。
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 head;
}
struct ListNode* pre=NULL;
struct ListNode* cur=head;
while(cur)
{
if(cur->val==val)
{
struct ListNode* next=cur->next;
if(pre==NULL)
{
head=next;
}
else
{
pre->next=next;
}
free(cur);
cur=next;
}
else
{
pre=cur;
cur=cur->next;
}
}
return head;
}
思路分析:要移除带头单链表所有符合要求的结点,首先要判断头指针是否为空。之后定义三个结点指针变量pre(指向前趋结点指针),cur(指向当前结点指针)和next(指向后继结点指针),用这三个变量进行操作。在函数实现中无非两种大情况:一种是cur指针指向的结点的符合条件,另一种则是不符合。判断这两个条件的前提则是cur指针的指向是否是空。为了保证下一个结点可以被找到,先把下一个结点保存,如果头指针指向的结点就是要移除的结点,那么必须让下一个结点变为头结点。
如果头结点不是要移除的元素,则将下一个节点覆盖到当前当前结点,即移除了当前结点,最后cur指针指向下一个结点。如果当前结点不是要移除的结点,那么pre、cur和next指针都向后移动一个结点。最后返回头指针head。
2.反转链表
代码如下:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseList(struct ListNode* head)
{
struct ListNode* newhead=NULL;
struct ListNode* cur=head;
if(head==NULL)
{
return