算法刷题-day1

文章目录

  • 求链表中倒数第k个节点
    • 思路
    • 注意事项:

求链表中倒数第k个节点

思路

  • 用两个指针,第一个指针先走k-1步
  • 然后两个指针一起走。当第一个指针走到尾节点的时候,第二个指针指向的就是倒数第k个节点。

注意事项:

  • 判断空指针和k=0的情况
  • 考虑链表长度小于k的情况
typedef struct
{
    ElemType data;
    struct ListNode *next;
} ListNode, *LinkList;


ListNode *FindK(ListNode *pHead, unsigned int k)
{
    // 判断空指针和k=0的情况
    if (pHead == null || k = 0)
        return null;

    ListNode *p1 = pHead;
    ListNode *p2 = pHead;
    ListNode *q = pHead;
    int number = 1;
    // 指针q用来计算链表长度number
    while(q->next != null)
    {
        ++number;
        q = q->next;
    }
    if (number < k)
    {
        printf("链表长度应大于等于k,请重新输入\n");
        return null;
    }

    // 将指针p1移动到k位置处
    for (unsigned int i = 0; i < k - 1 ; ++i)
        p1 = p1->next;

    //同时移动p1和p2,直到p1指向链表末尾时,p2指向的就是倒数第k个节点
    while(p1->next != null)
    {
        p1 = p1->next;
        p2 = p2->next;
    }

    return p2;
}

你可能感兴趣的:(剑指offer,算法,list,链表)