86. Partition List

来源:互联网 发布:泰国直播软件 编辑:程序博客网 时间:2024/06/15 20:20

Given a linked list and a value x, partition it such that all nodes less than x come before nodes greater than or equal to x.

You should preserve the original relative order of the nodes in each of the two partitions.

For example,
Given 1->4->3->2->5->2 and x = 3,
return 1->2->2->4->3->5.


/** * Definition for singly-linked list. * struct ListNode { *     int val; *     struct ListNode *next; * }; */struct ListNode* partition(struct ListNode* head, int x) {    struct ListNode *partition = NULL;    struct ListNode *index= head;    struct ListNode *preindex = NULL;    while(index != NULL) {        if (index->val < x) {   // 找到 < x 的元素            if (preindex == NULL) { // 表示 head 是第一个 < x 的元素                partition = head;            } else if (partition == NULL) { // 表示head 不是第一个 < x的元素                preindex->next = index->next;                index->next = head;                head = index;                partition = index;                index = preindex->next;                continue;            } else if (partition == preindex) { // 表示 partition 就是 preindex                partition = index;            } else {    // 最普遍的情况                preindex->next = index->next;                index->next = partition->next;                partition->next = index;                partition = index;                index = preindex->next;                continue;            }        }                preindex = index;        index = index->next;    }    return head;}

题目思想:



别人的思想:

创建一个开始的节点,就是我们上面partition有指向,然后往后面添加小于x的元素,最后将原来主链表中剩下的大于x的插入到已新创建的链表尾端:

struct ListNode* partition(struct ListNode* head, int x) {    struct ListNode*head1=(struct ListNode*)malloc(sizeof(struct ListNode));    struct ListNode*head2=(struct ListNode*)malloc(sizeof(struct ListNode));    struct ListNode*left=head1;    struct ListNode*right=head2;    while(head!=NULL){        if(head->val<x){            head1->next=head;               head1=head;        }        else{            head2->next=head;            head2=head;        }        head=head->next;    }    head2->next=NULL;//delete will be wrong important avoid cycle    head1->next=right->next;    return left->next;    }


原创粉丝点击