1.反转单链表
struct ListNode* reverseList(struct ListNode* head)
{
struct ListNode* cur=head;
struct ListNode* newhead=NULL;
while(cur)
{
struct ListNode* tail=cur->next;
//头插
cur->next=newhead;
newhead=cur;
cur=tail;
}
return newhead;
}
2.移除链表元素
这里我们要考虑很多种情况:
1.链表为NULL,直接返回NULL。
2.如果cur->val==val,创建一个指针del保存cur,然后cur走到下一个节点,free掉del,这就是删除步骤。
3.如果cur->val!=val,进行尾插,这里也分两种情况,第一种就是新链表为空,则tail=cur=newnode。第二种就是不为空,正常尾插,先将tail->next=cur,然后tail往后走,tail=tail->next,在第三种情况里面无论走哪一步cur都要往后走一步,cur=cur->next。
循环结束之后cur就遍历完了,这时还要做的一个小细节就是判断一下tail是否为NULL,如果为NULL,就将tail->next置空即可。
返回newnode即可。
struct ListNode* removeElements(struct ListNode* head, int val)
{
if(head==NULL)
{
return NULL;
}
struct ListNode* newhead=NULL,*tail=NULL,*cur=head;
while(cur)
{
if(cur->val==val)//删除
{
struct ListNode* del=cur;
cur=cur->next;
free(del);
}
else//尾插
{
if(tail==NULL)
{
newhead=tail=cur;
}
else
{
tail->next=cur;
tail=tail->next;
}
cur=cur->next;
}
}
if(tail)
tail->next=NULL;
return newhead;
}
3.求链表的中间节点
struct ListNode* middleNode(struct ListNode* head)
{
struct ListNode* slow=head;
struct ListNode* fast=head;
while(fast && fast->next)
{
fast=fast->next->next;
slow=slow->next;
}
return slow;
}
今天的分享到这里就结束啦!谢谢老铁们的阅读,让我们下期再见。
版权归原作者 进击的小C 所有, 如有侵权,请联系我们删除。