876. 链表的中间结点(C语言)
**給定一個頭結點為 head 的非空單鏈表,返回鏈表的中間結點。
如果有兩個中間結點,則返回第二個中間結點。
示例 1:
輸入:[1,2,3,4,5]
輸出:此列表中的結點 3 (序列化形式:[3,4,5])
返回的結點值為 3 。 (測評系統對該結點序列化表述是 [3,4,5])。
注意,我們返回了一個 ListNode 類型的對象 ans,這樣:
ans.val = 3, ans.next.val = 4, ans.next.next.val = 5, 以及 ans.next.next.next = NULL.
示例 2:
輸入:[1,2,3,4,5,6]
輸出:此列表中的結點 4 (序列化形式:[4,5,6])
由于該列表有兩個中間結點,值分別為 3 和 4,我們返回第二個結點。
提示:
給定鏈表的結點數介于 1 和 100 之間。**
這道題我最初想法是先求出鏈表長度len,然后借鑒了鏈表中倒數第k個節點這個辦法分奇偶使head移動到了相應節點位置;代碼如下:
/*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/struct ListNode* middleNode(struct ListNode* head) {int len=0;int n,i;struct ListNode* p=head;while(p!=NULL){len++;p=p->next;}struct ListNode* q=head;if(len%2==0){n=len/2;while(n--){q=q->next;}}else{n=len/2+1;while(n--){q=q->next;}}while(q!=NULL){q=q->next;head=head->next;}return head; }這個方法有點麻煩,我看到有很多用雙指針的方法,其中一個p指針一次移動兩個節點,另一個q移動一個節點,最后q節點的位置就是所要的位置;這個方法確實很巧妙,我還是太菜沒有想出來,代碼如下:
/*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/struct ListNode* middleNode(struct ListNode* head) {struct ListNode* p=head;struct ListNode* q=head;while(p!=NULL&&p->next!=NULL){p=p->next->next;q=q->next;}return q; }這個就很簡潔了;
在寫這個代碼的時候遇到了一個問題,有必要記錄一下:
1 while(p!=NULL&&p->next!=NULL)
2 while(p->next!=NULL&&p!=NULL)
這兩個循環判斷中只是前后順序不一樣,但是第二個就會報錯:
這個問題是關于空指針的問題,即編譯器不知道你使用的是不是空指針中的元素;
在2這里,編譯器會優先處理p->next!=NULL,而編譯器并不清楚p是否為空,所以無法執行該語句;
而1這里,編譯器就先判斷了p是否為空,然后就可以繼續往下判斷p->next是否為空了;
總結
以上是生活随笔為你收集整理的876. 链表的中间结点(C语言)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 剑指 Offer 24. 反转链表(C语
- 下一篇: 剑指 Offer 52. 两个链表的第一