分割链表
给你一个链表的头节点 head
和一个特定值 x
,请你对链表进行分隔,使得所有 小于 x
的节点都出现在 大于或等于 x
的节点之前。
你不需要 保留 每个分区中各节点的初始相对位置。
示例 1:
输入:head = [1,4,3,2,5,2], x = 3 输出:[1,2,2,4,3,5]
示例 2:
输入:head = [2,1], x = 2 输出:[1,2]
提示:
- 链表中节点的数目在范围
[0, 200]
内 -100 <= Node.val <= 100
-200 <= x <= 200
代码:
/*** 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*lessHead,*lessTail,*greaterHead,*greaterTail;//大小链表的哨兵卫lessHead=lessTail=(ListNode*)malloc(sizeof(ListNode));greaterHead=greaterTail=(ListNode*)malloc(sizeof(ListNode));ListNode*cur=head;//遍历原链表,将结点放到大小链表中while(cur){if(cur->val<x){//放到小链表中lessTail->next=cur;lessTail=lessTail->next;}else{//放到大链表中greaterTail->next=cur;greaterTail=greaterTail->next;}cur=cur->next;}if(greaterTail){greaterTail->next=NULL;}//小链表的尾和大链表的头(第一个有效结点)连接起来lessTail->next=greaterHead->next;//把动态开辟的空间释放掉free(greaterHead);ListNode*rethead=lessHead->next;free(lessHead);return rethead;
}
理解exit
1、exit的功能为:退出当前运行的程序,并将参数value返回给主调进程。
2、exit(0),exit(1) 和 exit(-1)的区别
- exit(0)表示程序正常退出;除了0之外,其他参数均代表程序异常退出,如:exit(1),exit(-1)。
- exit(1)和exit(-1)是分别返回1和-1到主调程序。
- exit(0)则是返回0。exit(0)表示程序正常退出,非0表示非正常退出。
3、return与exit的区别
- return是语言级别的,它表示了调用堆栈的返回;
- 而exit是系统调用级别的,它表示了一个进程的结束。
return和exit作用大致相同。
在main中:
return v; 与 exit(v); 的效果相同。
但是在其它功能函数中就会有所区别:
return会跳出函数,而exit会结束程序。
即: return是返回函数调用,如果返回的是main函数,则为退出程序 ;
exit是在调用处强行退出程序,运行一次该程序就被强制结束 。
4、通常可以借助exit()的返回值判断程序结束状态,
0表示程序正常退出,
其它值是异常退出,
在退出前可以给出一些提示信息,方便在调试程序时察看出错原因。