日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

876. 链表的中间结点(C语言)

發布時間:2025/3/21 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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语言)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。