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;
}