题目考察的知识点:与链表有关的题基本都是插入,删除,交换顺序等,解决这些问题通常将链表的指针进行修改。
题目分析:这道题常规操作就是定义两个头结点,一个头插0结点,另一个头插1节点,然后将两个链表连接起来;也可以定义一个头结点,记录第一个0结点插入的位置,在头结点后面插0结点,在第一个0结点后插1结点,两种思路大致一样。
本题解析所用的编程语言:c++
ListNode* sortCowsIV(ListNode* head) { // write code here ListNode newhead(-1); newhead.next = nullptr; ListNode* end = &newhead; //记录第一个0结点插入的位置 int i = 1; ListNode* cur = head; while (cur) { ListNode* next = cur->next; if (cur->val == 0) { cur->next = newhead.next; newhead.next = cur; if (i) //记录第一次0的位置 { end = cur; --i; } } else { cur->next = end->next; end->next = cur; } } return newhead.next; }