一、
給你單鏈表的頭結點 head ,請你找出并返回鏈表的中間結點。如果有兩個中間結點,則返回第二個中間結點。
要求:只遍歷一遍鏈表
可以使用快慢指針:fast 一次走兩步,slow 一次走一步。當 fast == NULL(偶數個結點)或者 fast->next == NULL(奇數個結點)就停止,返回 slow。
struct ListNode* middleNode(struct ListNode* head)
{struct ListNode* slow, *fast; slow = fast = head; while(fast && fast->next){slow = slow->next; fast = fast->next->next;}return slow;
}
注意:
1、一次性定義多個指針時,第二個及以后的指針名前面都要加 * 。
2、while( )括號內是循環繼續的條件。
二、
輸入一個鏈表,輸出該鏈表中倒數第k個結點。
要求:只遍歷一遍鏈表
快慢指針:fast 先走 k - 1 步,然后 fast 和 sliow 同時走,直到 fast 走到鏈表的最后一個結點。
struct ListNode* FindKthToTail(struct ListNode* pListHead, int k )
{struct ListNode* slow, *fast; slow = fast = pListHead;while(--k){fast = fast->next;}while(fast->next){slow = slow->next; fast = fast->next;}
}
三、
給你一個鏈表的頭節點?head
?,判斷鏈表中是否有環。
使用快慢指針:fast 一次走兩步,slow 一次走一步。
bool hasCycle(struct ListNode *head)
{ if(head == NULL)return false;if(head->next == NULL)return false;struct ListNode * slow = head;struct ListNode * fast = head;while(1){fast = fast->next;if(fast == slow)return true;if(fast == NULL)return false;fast = fast->next;if(fast == slow)return true;if(fast == NULL)return false;slow = slow->next;if(fast == slow)return true;if(slow == NULL)return false;}return false;
}