接着上一篇:微软面试100题之13题:输入一个单向链表,输出该链表中倒数第k 个结点中的结尾有一个扩展,题目如下:
输入一个单向链表。如果该链表的结点数为奇数,输出中间的结点;如果链表结点数为偶数,输出中间两个结点前面的一个。
分析:
思路一:先遍历一遍链表,获得链表节点总数,再根据总节点数的奇偶性输出中间节点。
思路二:两个指针,一快一慢,慢指针每走一步,快指针走两步。当快指针指向节点的下一节点或下一节点的下一节点为空时,慢指针所指即是中间节点。
代码如下:
struct Node
{
int val;
Node *next;
};
Node *get(Node *h)
{
if(h == NULL)
return NULL;
Node *p1=h,*p2=h;
while(p2->next != NULL
&& p2->next->next != NULL)
{
p1 = p1->next;
p2 = p2->next->next;
}
return p1;
}