今天讲一些关于链表的Oj题,相信你看完对链表又提升一个档次。
思路一
遍历一遍链表是Val值得时候free这个,然后我们往后走,一直走到末尾空指针得时候,新链表就是我们得答案,那我们用代码来表示一下吧。
c
struct ListNode* removeElements(struct ListNode* head, int val){
struct ListNode*cur=head;
struct ListNode*pre=NULL;
while(cur)
{
if(cur->val==val)
{
if(pre==NULL)
{
head=cur->next;
free(cur);
cur=head;
}
else
{
pre->next=cur->next;
free(cur);
cur=pre->next;
}
}
else
{
pre=cur;
cur=cur->next;
}
}
return head;
}
思路二
不是val我们就拿下来,是val就跳过,放到新链表中。
c
struct ListNode* removeElements(struct ListNode* head, int val){
struct ListNode*tail=NULL;
struct ListNode*cur=head;
head=NULL;
while(cur)
{
if(cur->val==val)
{
cur=cur->next;
}
else
{
if(tail==NULL)
{
head=tail=cur;
}
else
{
tail->next=cur;
tail=tail->next;
}
cur=cur->next;
}
}
if(tail)
tail->next=NULL;
return head;
}
思路三
带哨兵位得头节点得方法,是val拿下来,不是跳过。
c
struct ListNode* removeElements(struct ListNode* head, int val){
struct ListNode*cur=head;
head=(struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode*tail=head;
tail->next=NULL;
while(cur)
{
if(cur->val==val)
{
struct ListNode*del=cur;
cur=cur->next;
free(del);
}
else
{
tail->next=cur;
cur=cur->next;
tail=tail->next;
}
}
tail->next=NULL;
struct ListNode*del=head->next;
free(head);
return del;
}
这题我们可以改变指向,给三个指针变量,变方向就可以解决。
c
struct ListNode* reverseList(struct ListNode* head){
if(head==NULL)
return NULL;
struct ListNode*cur=head;
struct ListNode*pre=NULL;
struct ListNode*next=cur->next;
while(cur)
{
cur->next=pre;
pre=cur;
cur=next;
if(next)
next=next->next;
}
return pre;
}
思路二
头插到新链表就可以了。
c
struct ListNode* reverseList(struct ListNode* head){
struct ListNode*cur=head;
struct ListNode*phead=NULL;
while(cur)
{
struct ListNode*next=cur->next;
cur->next=phead;
phead=cur;
cur=next;
}
return phead;
}
用快慢指针,快走两步,慢走一步,就可以解决。
c
struct ListNode* middleNode(struct ListNode* head){
struct ListNode*slow=head;
struct ListNode*fast=head;
while(fast && fast->next)
{
slow=slow->next;
fast=fast->next;
if(fast)
fast=fast->next;
}
return slow;
}
c
struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) {
struct ListNode*slow=pListHead;
struct ListNode*fast=pListHead;
while((k--))
{
if(fast==NULL)
return NULL;
fast=fast->next;
}
while(fast)
{
fast=fast->next;
slow=slow->next;
}
return slow;
}
这题和快慢指针差不多,先让快指针走k步,然后同时走,结束条件就是快指为空的时候。
今天就先分享四道题目,后面再继续分享几道!!!谢谢大家观看