程序员面试宝典|【程序员面试宝典】链表分割

题目: 现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。
程序员面试宝典|【程序员面试宝典】链表分割
文章图片

题目分析: 【程序员面试宝典|【程序员面试宝典】链表分割】解决这个问题采用的方法是:
把比x小的值插入到一个链表,
把比x大的值插入到一个链表,
再把两个链表连接到一起。
代码实现:

/* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; */ class Partition { public: ListNode* partition(ListNode* pHead, int x) { // write code here struct ListNode* lessHead,*lessTail,*greaterHead,*greaterTail; lessHead = lessTail = (struct ListNode*)malloc(sizeof(struct ListNode)); greaterHead = greaterTail = (struct ListNode*)malloc(sizeof(struct ListNode)); struct ListNode* cur = pHead; while(cur) { if(cur->valnext = cur; lessTail = cur; } else { greaterTail->next = cur; greaterTail = cur; } cur = cur->next; } //切记把最后一个的next置成空。 greaterTail->next = NULL; lessTail->next = greaterHead ->next; struct ListNode* head = lessHead->next; free(lessHead); free(greaterHead); return head; } };

    推荐阅读