目录
3. 给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个 中间结点 力扣
4. 输入一个链表,输出该链表中倒数第k个结点。 链表中倒数第k个结点_牛客题霸_牛客网
1. 删除链表中等于给定值 val 的所有节点。力扣
2. 反转一个单链表。力扣
3. 给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个 中间结点 力扣
4. 输入一个链表,输出该链表中倒数第k个结点。链表中倒数第k个结点_牛客题霸_牛客网
1、删除链表中等于给定值 val 的所有节点
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* removeElements(struct ListNode* head, int val){
struct ListNode* prev=NULL,*cur=head;
while(cur)
{
if(cur->val==val)
{
struct ListNode* next=cur->next;
if(prev==NULL)
{
free(cur);
// prev=cur;
cur=next;
head=next;
}
else
{
prev->next=next;
free(cur);
cur=next;
}
}
else
{
prev=cur;
cur=cur->next;
}
}
return head;
}
2、反转一个单链表
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseList(struct ListNode* head){
struct ListNode* newhead=NULL,*cur=head,*next=NULL,*next1=NULL;
while(cur)
{
next=cur;
next1=cur->next;
cur->next=newhead;
newhead=cur;
cur=next1;
}
return next;
}
3、给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个 中间结点
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* middleNode(struct ListNode* head){
struct ListNode* fast=head,*slow=head;
while(fast&&fast->next!=NULL)
{
fast=fast->next->next;
slow=slow->next;
// if(fast==NULL)
// break;
}
return slow;
}
4、输入一个链表,输出该链表中倒数第k个结点。
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* FindKthToTail(ListNode* pListHead,unsigned int k) {
ListNode* fast=pListHead,*slow=pListHead;
//双指针法->
// while(k--)
// {
// if(fast==NULL)
// return NULL;
// fast=fast->next;
// }
// while(fast&&slow)
// {
// fast=fast->next;
// slow=slow->next;
// }
// return slow;
//循环法->
int lenth=0;
while(fast)
{
++lenth;
fast=fast->next;
}
if(lenth<k)
return NULL;
int m=lenth-k;
while(m)
{
slow=slow->next;
m--;
}
return slow;
}
};