目录
搭配食用更佳哦~~
前面学了单链表的相关知识,我们来尝试做一下关于链表的经典算法题~
前言
在我们学习了那么多经典题目之后我们来看一道来自力扣上的有关链表的面试题来给脑子上上强度 ~
面试题 02.04. 分割链表 - 力扣(LeetCode)https://leetcode.cn/problems/partition-list-lcci/description/
一.思路
1)原链表修改
这个思路不创建新链表,在原链表基础上进行修改,定义指针变量来遍历链表遇到大于 val 值的就尾插并删除原节点,但需要注意此方法需要创建好多指针变量来保证尾插和销毁节点时链表的完整性。
2)创建新链表
顾名思义,创建一个新的链表,对原链表进行遍历,分别头插和尾插:
3)大小链表
创建两个链表,,当原链表遍历到值大于 val 的就插入大链表,反之插入小链表 ,最后将小链表尾节点与大链表第一个有效节点相连,注意我们创建两个空链表时创建了哨兵位,不能将节点和这个相连会导致结果错误,同时在我们完成代码之后,要注意大链表中的尾节点指针指向是哪里,一定要将其指为空,不然会死循环的
二.代码实现
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
typedef struct ListNode ListNode;
struct ListNode* partition(struct ListNode* head, int x){
//创建带头的大小链表
ListNode* lessHead,*lessTail;
ListNode* greaterHead, *greaterTail;
lessHead = lessTail = (ListNode*)malloc(sizeof(ListNode));
greaterHead = greaterTail = (ListNode*)malloc(sizeof(ListNode));
//遍历原链表,将原链表的节点插到新链表中
ListNode* pcur = head;
while(pcur){
if(pcur->val < x){
//尾插到小链表中
lessTail->next = pcur;
lessTail = lessTail->next;
}else{
//尾插到大链表中
greaterTail->next = pcur;
greaterTail = greaterTail->next;
}
pcur = pcur->next;
}
//修改大链表尾节点指向NULL
greaterTail->next = NULL;
//将小链表尾节点和大链表第一个有效节点相连
lessTail->next = greaterHead->next;
ListNode* ret = lessHead->next;
free(lessHead);
free(greaterHead);
lessHead = greaterHead = NULL;
return ret;
}
这题到这就结束啦~虽然创建两个链表看起来比较复杂一点,但其实实际写起来还是蛮简单的 ,到这有关链表的题就更完咯~
🎈🎈完结撒花🎈🎈