题目:给定一个链表和一个数x,将链表中比x小的放在前面,其他的放在后头。例如:
Given 1->4->3->2->5->2
and x = 3,
return 1->2->2->4->3->5
.
思路:
1. 再用两个node,一个指向所有小于x的,一个指向其他的,之后把两个接在一起。接在一起需要注意large是否未移动过。
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode *partition(ListNode *head, int x) { if (head == NULL || head -> next == NULL) return head; ListNode *ans_small = new ListNode(0); // 存小于x的 ListNode *ans_large = new ListNode(0); // 存不小于x的 ans_small -> next = head; ans_large -> next = head; ListNode *small = ans_small; ListNode *large = ans_large; ListNode *cur = head; while(cur) { if (cur -> val < x) { small -> next = cur; small = cur; cur = cur -> next; } else { large -> next = cur; large = cur; cur = cur -> next; } } large -> next = NULL; // 这个是为了防止large指向head的时候 small -> next = ans_large -> next; head = ans_small; delete ans_small, ans_large; return head -> next; } };
2. 就创建一个node,这个node遇见比x小的就插入
class Solution { public: ListNode *partition(ListNode *head, int x) { if (head == NULL || head -> next == NULL) return head; ListNode *ans = new ListNode(0); ans -> next = head; ListNode *small = ans; // 在它的后面插入小的 ListNode *cur = head; ListNode *pre = ans; // cur的前一个指针,方便插入操作 bool flag = true; // true说明要插入的紧接着就是下一个,那就不用插入,加加就好 while(cur != NULL) { if (cur -> val < x && small -> next == cur) // 待插入的和之前小的相邻就不用插入了 { pre = pre -> next; cur = cur -> next; small = small -> next; } else if (cur -> val < x && small -> next != cur) // 不相邻,插入 { ListNode *tmpnext = small -> next; small -> next = cur; small = cur; cur = cur -> next; small -> next = tmpnext; pre -> next = cur; flag = true; } else if (cur -> val >= x) { flag = false; cur = cur -> next; pre = pre -> next; } } head = ans; delete ans; return head -> next; } };
从第二个思路中知道了原来可以判断连个node是否相等!这个之前以为不能那样判断的,原来可以用 if(node1 == node2)。多学一个知识点了。