赞
踩
今天在LeetCode觉得很不错,想和大家们一起分享这道链表题——分割链表:https://leetcode.cn/problems/partition-list-lcci废话不多说,让我们直接进入正题吧。
大致思路:我们可以通过建立两个链表,一个小链表,一个大链表。
当原链表在遍历的过程中,如果该数据小于x,我们就把该节点尾插到小链表中。
反之,当该节点大于等于x,我们就把该节点尾插大链表中。
解题步骤:1.对于小链表,我们创建了lessphead用于指向小链表的头节点,lessptail用于指向小链表的尾节点。
对于大链表,我们创建了graterphead用于指向小链表的头节点,graterptail用于指向小链表的尾节点。
并且我们用malloc申请到了两块节点空间。分别让小链表的lessphead,lessptail和大链表的graterphead,gerterptail各自指向一块申请来的节点空间。(这里的作用是充当哨兵位)
2.这一块就是我们的大致思路差不多:当原链表在遍历的过程中,如果该数据小于x,我们就把该节点尾插到小链表中。
反之,当该节点大于等于x,我们就把该节点尾插大链表中。
3.我们需要把大链表中的graterptail置为NULL。这一点很重要!!!否则返回答案的时候不仅会死循环还会有报错。
同时需要注意的是:我们申请的两块节点空间最好返还给操作系统,并让对应指针置为NULL。在归还空间之前,需要定义一个变量把lessphead->next存起来。这样做的目的是,防止出现报错,因为在我们归还空间的时候,会把lessphead和graterphead置为NULL。此时如果答案返回是lessphead->next,肯定会报错。
- /**
- * Definition for singly-linked list.
- * struct ListNode {
- * int val;
- * struct ListNode *next;
- * };
- */
- typedef struct ListNode ListNode;
- struct ListNode* partition(struct ListNode* head, int x)
- {
- if(head==NULL)
- {
- return head;
- }
- ListNode* lessphead,*lessptail;
- ListNode* graterphead,*graterptail;
- lessphead=(ListNode*)malloc(sizeof(ListNode));
- graterphead=(ListNode*)malloc(sizeof(ListNode));
- lessptail=lessphead;
- graterptail=graterphead;
- ListNode* pcur=head;
- while(pcur)
- {
- if(pcur->val<x)
- {
- lessptail->next=pcur;
- lessptail=lessptail->next;
- }
- else
- {
- graterptail->next=pcur;
- graterptail=graterptail->next;
- }
- pcur=pcur->next;
- }
- graterptail->next=NULL;
- lessptail->next=graterphead->next;
- ListNode* ret=lessphead->next;
- free(lessphead);
- free(graterphead);
- lessphead=graterphead=NULL;
- return ret;
- }
注意该代码是在LeetCode环境下运行的。
今天的题目分享就到这了,帅哥美女们咱们下期再见。拜拜。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。