目录
前言🌳
1.链表中倒数第k个结点🌸
1.1 思路
1.2 代码
2. 链表的回文结构🪸
2.1 思路
2.2 代码
3.相交链表🌪️
3.1 思路
3.2 代码
4.环形链表I🌊🛳️
4.1 思路
4.2 代码
4--->5过渡:拓展思考🧐💭
5.环形链表II🏥🚑
5.1 思路
5.2 代码
6.随机链表的复制👊🤡
6.1 思路编辑
6.2 代码
后语🍻
前言🌳
之前,我们已经将链表部分的知识了解学习的差不多了,那么没有题目来练练手算个什么事⁉️必需给大家安排上,小江优选---保质又保量‼️
1.链表中倒数第k个结点🌸
链表中倒数第k个结点_牛客题霸_牛客网
1.1 思路
忘记之前的题目的同学,可以看看这篇博客:
学习笔记---看完就会的单链表的应用~~-CSDN博客文章浏览阅读119次,点赞36次,收藏16次。小链表的尾节点指向大链表的第一个节点(不是指向哨兵位)https://blog.csdn.net/2301_79184587/article/details/134049599
1.2 代码
2. 链表的回文结构🪸
链表的回文结构_牛客题霸_牛客网
2.1 思路
2.2 代码
/*
struct ListNode {int val;struct ListNode *next;ListNode(int x) : val(x), next(NULL) {}
};*/
class PalindromeList {public:bool chkPalindrome(ListNode* A) {if (A == NULL) {return NULL;//空链表}ListNode* n1, *n2, *n3,*cur1,*cur2;n1 = NULL;n2 = A;n3 = A->next;while (n2) {n2->next = n1; n1 = n2;n2 = n3;if (n3) {n3 = n3->next;//注意空指针}}cur1=A,cur2=n1;//比较while(cur1&&cur2){if(cur1->val==cur2->val){cur1=cur1->next;cur2=cur2->next;}else {return false;}}return true;}
};
/*
struct ListNode {int val;struct ListNode *next;ListNode(int x) : val(x), next(NULL) {}
};*/
class PalindromeList {public:bool chkPalindrome(ListNode* A) {if (A == NULL) {return NULL;//空链表}ListNode* slow,*fast;slow=fast=A;while(fast&&fast->next){fast=fast->next->next;slow=slow->next;}ListNode* n1, *n2, *n3,*cur1,*cur2;n1 = NULL;n2 = slow;n3 = slow->next;while (n2) {n2->next = n1; n1 = n2;n2 = n3;if (n3) {n3 = n3->next;//注意空指针}}cur1=A,cur2=n1;//比较while(cur1&&cur2){if(cur1->val==cur2->val){cur1=cur1->next;cur2=cur2->next;}else {return false;}}return true;}
};
3.相交链表🌪️
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
3.1 思路
3.2 代码
/*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {//遍历判断是否相交struct ListNode* cur1=headA;struct ListNode* cur2=headB;int count1=1,count2=1;
//长度都少一,但相减之后不影响--->但是要想计数准确,我们也可以从1开始计数
//不能用cur1和cur2遍历,因为我们要找到尾节点的地址判断是否相交,否则到cur1和cur2都为NULL的时候,循环结束,尾节点的地址就找不到了while(cur1->next){count1++;cur1=cur1->next;}while(cur2->next){count2++;cur2=cur2->next;}if(cur1!=cur2){return NULL;}//到这里,就是相交了-->计算差值int D_value=abs(count1-count2);//假设法struct ListNode* longlist=headA,* shortlist=headB;if(count1<count2){longlist=headB;shortlist=headA;}//长链表走差值+齐头并进while(D_value--){longlist=longlist->next;}while(longlist!=shortlist){longlist=longlist->next;shortlist=shortlist->next;}return longlist;
}
4.环形链表I🌊🛳️
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
4.1 思路
4.2 代码
4--->5过渡:拓展思考🧐💭
前提:带环链表
1.slow一次1步,fast一次2步,一定能相遇吗?
2.slow一次1步,fast一次3步,一定能相遇吗?
3.slow一次m步,fast一次n步,一定能相遇吗?
1.slow一次1步,fast一次2步,一定能相遇吗?
2.slow一次1步,fast一次3步,一定能相遇吗?
3.slow一次m步,fast一次n步,一定能相遇吗?
5.环形链表II🏥🚑
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
5.1 思路
5.2 代码
6.随机链表的复制👊🤡
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
6.1 思路
6.2 代码
/*** Definition for a Node.* struct Node {* int val;* struct Node *next;* struct Node *random;* };*/struct Node* copyRandomList(struct Node* head) {if(head==NULL){return NULL;}struct Node* cur=head;//插入到原链表while(cur){struct Node* copy=(struct Node*)malloc(sizeof(struct Node));copy->val=cur->val;copy->next=cur->next;cur->next=copy;cur=cur->next->next;}cur=head;while(cur){struct Node* copy=cur->next;if(cur->random==NULL){copy->random=NULL;}else{copy->random=cur->random->next;}cur=cur->next->next;}cur=head;struct Node* newhead,* tail;newhead=tail=NULL;while(cur){struct Node* copy=cur->next;struct Node* next=copy->next;if(newhead==NULL){newhead=tail=copy;}else{tail->next=copy;tail=tail->next;}cur->next=next;cur=cur->next;}return newhead;
}
后语🍻
本次的分享到这里就结束了!!!
PS:小江目前只是个新手小白。欢迎大家在评论区讨论哦!有问题也可以讨论的!
如果对你有帮助的话,记得点赞👍+收藏⭐️+关注➕