链表的中间结点数据结构oj题(力扣876)
目录
题目描述:
题目分析:
代码解决:
题目描述:
给你单链表的头结点 head
,请你找出并返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。
题目分析:
寻找中间节点这道题原理就是通过1/2总长度,对于我来说一开始想到的方法一就是先计算内部有多少个节点,然后进行除以二,得到中间节点数后,进行遍历到对应的中间节点(本人有点笨,只能想到这种方法了)。通过向大佬学习,我发现一个更加好用的方法,思路二就是快慢指针,这个快慢指针就是一个fast指针每次走两步,另一个low指针每次走一步,等fast出界时,low就是中间指针,这个方法是个好方法思路简单,代码也好写,就是难想出来哈哈哈。
代码解决:
思路一:
/*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/
typedef struct ListNode ListNode;
struct ListNode* middleNode(struct ListNode* head) {ListNode* n1, * n2;n1 = n2 = head;int count = 0;//遍历计算链表长度while (n1){n1 = n1->next;count++;}//移动到中间链表count = count / 2;while (count){n2 = n2->next;count--;}return n2;
}
思路二:
/*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/
typedef struct ListNode ListNode;
struct ListNode* middleNode(struct ListNode* head) {ListNode* fast = head;ListNode* low = head;while (fast != NULL && fast->next != NULL){fast = fast->next->next;low = low->next;}return low;
}