剑指offer之链表

1.求链表倒数第K个节点

ahead指针先走K-1步,behind指针开始走,ahead走到末尾,此时behind刚好是倒数第K个

2.求链表中间节点

ahead指针一次走2步,behind一次走1步,当ahead走到末尾时,behind刚好是中间节点

3.判断链表是否成环

ahead指针一次走2步,behind一次走1步,当ahead走到末尾时,还没有追上behind说明无环。如果没有到末尾就遇上了,说明有环。

4.链表反转

2个指针相邻同步后移,不停后者next改指向前者

ListNode* reverseList(ListNode* head)
{
    ListNode* result = NULL;//反转后的头节点
    ListNode* cur = head;
    ListNode* pre = NULL;

    while(cur != NULL)
    {
        ListNode* next = cur->next;//覆盖前先记录旧值
        if(next == NULL)
        {
            result = cur;//记录尾节点
        }

        cur->next = pre;//改变cur节点next指针指向前者
        pre = cur;
        cur = next;//同步后移
    }
    return result;
}

5.链表合并

ListNode* mergeList(ListNode* head1, ListNode* head2)
{
    if(head1 == NULL)
        return head2;
    else if(head2 == NULL)
        return  head1;

    if(head1->data > head2->data)
    {//保证head1头节点小于等于head2头节点,合并后头节点就是head1
        int temp = head2->data;
        head2->data = head1->data;
        head1->data = temp;
    }

    ListNode* cur1 = head1;
    while(head2 != NULL)//依次将链表2节点插入链表1合适位置
    {
        while(cur1->next != NULL && cur1->next->data < head2->data)
            cur1 = cur1->next;

        //此时cur1 <= head2 <= cur1->next或者cur1是尾节点但不大于head2,将head2插在cur后即可
         ListNode* tmp = head2;
        head2 = head2->next;

        tmp->next = cur1->next;
        cur1->next = tmp;
    }

    return head1;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值