题目来源:
代码部分,参考官方题解的写法:
// 思路: 就是把原始链表,拆分为2部分,最后再拼接一下。struct ListNode* partition(struct ListNode* head, int x) {struct ListNode* small = malloc(sizeof(struct ListNode));struct ListNode* smallHead = small;struct ListNode* big = malloc(sizeof(struct ListNode));struct ListNode* bigHead = big;while(head != NULL) {if (head->val < x) {small->next = head;small = small->next; // 这里先确定 small.next 的值。 然后再看 small 自身!!} else {big->next = head;big = big->next;}head = head->next;}// 拼接big->next = NULL;small->next = bigHead->next;return smallHead->next;
}
问题与思考:
- 对下面这个写法进行分析:
struct ListNode* small = malloc(sizeof(struct ListNode));
struct ListNode* smallHead = small;
其中 small 是一个指针, 而且申请内存了。
smallHead 也是一个指针,smallHead 其实是把 small 复制一份。
所以这里在命名上,我觉得不应该叫做 smallHead, 叫做 smallCopy 比较合适。
-
while(head != NULL)
这个写法,能否写成:
while(head)
答案是能。而且也能正常通过。
问题是: 有什么区别??
- 第三点已经写在代码注释里面了。
small->next = head;
small = small->next; // 这里先确定 small.next 的值。 然后再看 small 自身!!
small = small->next, 这个写法,其实在python 中就是 head = head.next, 之前写过很多, 就是把节点往下移动,往下传递。
为什么一到 C 语言里面, 就觉得很陌生呢。