【数据结构刷题】链表OJ题训练 - c
创始人
2025-05-31 23:20:07
0

在这里插入图片描述

文章目录

  • 前言
  • 1. 移除链表元素
  • 2. 反转链表
  • 3. 链表的中间结点
  • 4. 合并两个有序链表
  • 5. 链表分割
  • 6. 链表的回文结构
  • 7. 相交链表
  • 8. 环形链表
  • 9. 复制带随机指针的链表


前言

学完链表后,刷一些基础的链表题有助于提高对链表的理解与运用。


1. 移除链表元素

题目链接:移除链表元素
在这里插入图片描述

思路:递归/迭代
递归:
在这里插入图片描述
迭代:

  1. 创建新指针ans
  2. 遍历链表head,将不是值不是val的结点尾插在ans链表上
  3. 返回ans
//递归
struct ListNode* removeElements(struct ListNode* head, int val) {if (head == NULL) {return head;}head->next = removeElements(head->next, val);return head->val == val ? head->next : head;
}
//迭代
void SLTPushBack(struct ListNode** pphead, int x)
{//情况:链表为空或不为空struct ListNode* newnode = malloc(sizeof(struct ListNode));assert(newnode != NULL);newnode->val = x;newnode->next = NULL;if (*pphead == NULL){*pphead = newnode;}else{struct ListNode* tail = *pphead;while (tail->next != NULL){tail = tail->next;}tail->next = newnode;}
}
struct ListNode* removeElements(struct ListNode* head, int val){struct ListNode* ans = NULL;while(head) {if (head->val != val) {SLTPushBack(&ans, head->val);}head = head->next;}return ans;
}

2. 反转链表

题目链接:反转链表
在这里插入图片描述

struct ListNode* reverseList(struct ListNode* head) {struct ListNode* cur = head, *newhead = NULL;while (cur) {struct ListNode* next = cur->next;cur->next = newhead;newhead = cur;cur = next;}return newhead;}
}

3. 链表的中间结点

题目链接:链表的中间结点
在这里插入图片描述

思路:快慢指针
快指针(fast)一次走两步,慢指针(slow)一次走一步
注意:奇、偶
在这里插入图片描述

struct ListNode* middleNode(struct ListNode* head){struct ListNode *fast, *slow;fast = slow = head;while(fast && fast->next) {slow = slow->next;fast = fast->next->next;}return slow;
}

同类题:链表中倒数第k个结点


4. 合并两个有序链表

题目链接:合并两个有序链表
在这里插入图片描述

本题用递归很简单解决。
官方的动图解答非常清晰,建议看官方的解答

struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2)
{if(list1 == NULL) {return list2;}if(list2 == NULL) {return list1;}if(list1->val <= list2->val) {list1->next = mergeTwoLists(list1->next, list2);return list1;}else {list2->next = mergeTwoLists(list1, list2->next);return list2;}
}

5. 链表分割

题目链接:链表分割
在这里插入图片描述

思路:
创立两个头节点,一个放比x小的结点,另一个放不比x小的结点
遍历原链表,将每个结点尾插在对应的头结点后面
最后将两个头节点后面的链表合在一起
在这里插入图片描述

class Partition {
public:ListNode* partition(ListNode* pHead, int x) {// write code herestruct ListNode* com_low, *com_up, *Tail_low, *Tail_up;com_low = Tail_low = (struct ListNode*)malloc(sizeof(struct ListNode));com_up = Tail_up = (struct ListNode*)malloc(sizeof(struct ListNode));struct ListNode* cur = pHead;while(cur) {if(cur->val < x) {Tail_low->next = cur;Tail_low = Tail_low->next;}else {Tail_up->next = cur;Tail_up = Tail_up->next;}cur = cur->next;}Tail_low->next = com_up->next;Tail_up->next = NULL;struct ListNode* ans = com_low->next;free(com_up);free(com_low);return ans;}
};
}

6. 链表的回文结构

题目链接:链表的回文结构
在这里插入图片描述

思路:需要先做2,3题。不能反转整个链表。
在这里插入图片描述

class PalindromeList {public:struct ListNode* reverseList(struct ListNode* head) {struct ListNode* cur = head, *newhead = NULL;while (cur) {struct ListNode* next = cur->next;cur->next = newhead;newhead = cur;cur = next;}return newhead;}struct ListNode* middleNode(struct ListNode* head) {struct ListNode* fast, *slow;fast = slow = head;while (fast && fast->next) {slow = slow->next;fast = fast->next->next;}return slow;}bool chkPalindrome(ListNode* head) {struct ListNode* mid = middleNode(head);struct ListNode* rhead = reverseList(mid);while(rhead) {if(head->val != rhead->val) {return false;}head = head->next;rhead = rhead->next;}return true;}
};

7. 相交链表

题目链接:相交链表
在这里插入图片描述

思路:
分别遍历A,B链表
使用countA, countB分别记录对应的结点数
查看尾节点是否一致
若一致则继续,比较countA,countB,让长的链表多走|countA-countB|步,再同时继续向后,直到二者相等
不一致则返回NULL

struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {struct ListNode* tailA, *tailB, *curA, *curB;int countA = 0, countB = 0;curA = tailA = headA;curB = tailB = headB;while(tailA->next) {tailA = tailA->next;countA++;}while(tailB->next) {tailB = tailB->next;countB++;}if(tailA != tailB) {return NULL;}else {while(countA > countB) {curA = curA->next;countA--;}while(countB > countA) {curB = curB->next;countB--;}while(curA != curB) {curA = curA->next;curB = curB->next;}return curA;}
}

8. 环形链表

题目链接:环形链表
在这里插入图片描述

思路
在这里插入图片描述

bool hasCycle(struct ListNode* head) {struct ListNode* slow = head;struct ListNode* fast = head;while(fast && fast->next) {fast = fast->next->next;slow = slow->next;if(slow == fast) {return true;}}return NULL;
}

同类题:环形链表2
在这里插入图片描述


9. 复制带随机指针的链表

题目链接:复制带随机指针的链表
在这里插入图片描述

思路
在这里插入图片描述

struct Node* copyRandomList(struct Node* head) {//1. 拷贝节点放在原节点的后面struct Node* cur = head, *next = NULL;while(cur) {struct Node* copy_node = (struct Node*)malloc(sizeof(struct Node));next = cur->next;cur->next = copy_node;copy_node->val = cur->val;copy_node->next = next;cur = next;}//2. 对拷贝节点的random赋值cur = head;while(cur) {if(cur->random == NULL) {cur->next->random = NULL;}else {cur->next->random = cur->random->next;}cur = cur->next->next;}//3. 取下拷贝节点并链接,恢复原链表struct Node* tail, *ans = NULL;int flag = 1;cur = head;while(cur) {next = cur->next;//恢复原链表cur->next = next->next;if(flag) {ans = tail = next;next->next = NULL;flag = !flag;}else {//链接拷贝节点tail->next = next;tail = next;tail->next = NULL;}cur = cur->next;}return ans;
}

在这里插入图片描述

相关内容

热门资讯

原创 关... 近期,酒店行业传出了令人震惊的消息! 5月30日,大理实力希尔顿酒店在拍卖中遭遇流拍。 据了...
一锅酸甜暖人心!番茄土豆豆腐汤... 在众多家常汤品中,番茄土豆豆腐汤宛如冬日里的暖阳、夏日里的清风,以简单的食材组合,成就了令人念念不忘...
红枣夹核桃:养生零食的黄金组合 红枣夹核桃是一种将传统滋补食材巧妙结合的养生零食,兼具美味与营养。这种简单却富有创意的搭配,将红枣的...
炸春卷时,冷油下锅温和均匀但易... 春卷之惑:炸春卷油温引争议 春节,那可是咱中国人一年里最重要的节日,一家人围坐在一起,热热闹闹地准...
今天起,南昌人吃晚饭请调整一下... 新闻荐读 近日发表的一项新研究显示:进食晚的人,血糖升高的幅度要明显大于早进食者;吃得晚且晚餐吃得多...
酸奶常温下可以放置多久?科学解... 酸奶作为一种广受欢迎的乳制品,因其丰富的营养价值和独特的口感深受消费者喜爱。然而,关于酸奶在常温下的...
广东肇庆,一座被低估的美食之城... 肇庆星湖小筑 海鲜煲,鲍鱼、海虾等食材炖汤,鲍鱼有嚼劲,海虾嫩,汤头鲜美。 鹅肝酱酿煎杏鲍菇,用...
旅游选热门景区还是小众景点 旅游大作战:热门景区PK小众景点,谁才是你的心头好? 宝子们,又到了旅游的黄金季节啦!每到这个时候...
原创 挪... 宝子们,我跟你们说,前段时间我去挪威的松恩峡湾坐船,那经历,简直绝了! 松恩峡湾,那可是挪威最大的峡...
布鲁克斯樱桃:脆甜多汁的“冰糖... "一颗樱桃甜过蜜,皮薄肉厚惹人迷",这句顺口溜形容的正是近年来备受追捧的布鲁克斯樱桃。这个来自美国的...
探索东北美景:从本溪出发到丹东... 在中国的东北,有一片美丽的土地,那里有着壮观的自然景观和深厚的文化底蕴。今天,我想和大家分享一条绝对...
新疆五天游玩旅游攻略,新疆结伴... 新疆五天游玩旅游攻略,新疆结伴自由行5日游推荐路线! 新疆,这片占据祖国六分之一版图的广袤土地,宛如...
炒茄子丝的美味做法及技巧分享,... 茄子,这种紫色的蔬菜,真的是一道让人垂涎欲滴的美食。无论是清蒸、烧烤,还是炒菜,茄子的独特口感和吸收...
酸奶是如何发酵的? 酸奶的发酵过程是一场微生物与营养物质的奇妙共舞,其核心在于乳酸菌将牛奶中的乳糖转化为乳酸的神奇转化。...
清香蒜韵绕舌尖:解锁蒜蓉茼蒿的... 在烟火气十足的家常菜中,蒜蓉茼蒿宛如一抹清新的绿意,以简单的食材搭配,成就了餐桌上的经典美味。茼蒿自...
宜昌三峡独家旅游3天二晚小包团... 最近,我有幸和朋友们一起踏上了前往宜昌三峡的旅程。宜昌三峡,那山清水秀、景色宜人的地方,一直是我向往...
一山藏万物生,山之茶紫阳毛尖零... 在健康饮品备受追捧的当下,劲派啤酒(山东)有限公司携手紫阳县文化旅游投资发展有限公司,重磅推出山之茶...
贵州“粉丝”何其多|一千个贵州... 嗦一口粉,丰富的调料刺激着刚醒的味蕾与头脑,这是贵州人开启一天的最佳方式;嗦完粉,喝一口鲜香的牛肉汤...