1.中心结点

代码:
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* middleNode(struct ListNode* head)
{
    if(head->next==NULL) return head;
	struct ListNode* fast = head,*slow = head;
	while (fast && fast->next)
	{
		slow = slow->next;
		fast = fast->next->next;
	}
	return slow;
}这里应用了快慢指针——fast,slow。
每次让slow走一步,fast走两步,这样可以知道fast的速度就是slow的两倍,所以当fast走到链表的最后一个数据时,slow就刚好走到链表的中间位置。
但是,这里会出现结束条件的两种不同情况:
1.链表个数为单数时,fast->next为空时,退出循环,返回slow指针位置。
2.链表个数为双数时,fast为空时,退出循环,返回slow指针的位置。
具体情况可以通过画图进一步理解。
2.倒数第k个结点

这个题也可以用快慢指针解决:
让慢指针指向第一个节点,快指针指向第k+1个节点,这样在一开始快指针就比慢指针多了k步,然后一起以相同的速度向右移动,直到快指针指向空,慢指针指向的就是倒数第k个位置。
代码:
/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 * };
 */
/**
 * 
 * @param pListHead ListNode类 
 * @param k int整型 
 * @return ListNode类
 */
struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) {
    // write code here
    if(pListHead == NULL||k <= 0) return NULL;
    struct ListNode* slow = pListHead;
    struct ListNode* fast = slow;
    while(k--)
    {
        if(fast == NULL) return NULL;
        fast = fast -> next;
    }
    while(fast)
    {
        slow = slow -> next;
        fast = fast ->next;
    }
    return slow;
}

















