ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

数据结构-链表中倒数第K个节点

2019-07-27 19:42:53  阅读:142  来源: 互联网

标签:head NULL ListNode Next 链表 节点 数据结构 倒数第


原文链接:http://www.cnblogs.com/wn19910213/p/3723347.html

题目:输入一个链表,输出该链表中倒数第K个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如一个链表有6个节点,从头节点开始他们的值依次为1,2,3,4,5,6.这个链表的倒数第三个节点是值为4的节点。

分析:不能多次遍历链表,只能一次遍历。

/*
剑指offer面试题15
*/
#include <iostream>

using namespace std;

struct ListNode{
    ListNode* Next;
    int data;
};


/*
把题目看错,看成删除了。但是删除功能可以实现,
同样存在和题目一样的问题,存在多次遍历问题。
为了代码质量更好要求只遍历一次。
*/
ListNode* DeleteKnode(ListNode** head,int k){
    if(*head == NULL || k <= 0){
        return NULL;
    }

    ListNode* p = *head;
    ListNode* q = new ListNode;
    int count = 0;
    int num = 0;

    while(p != NULL){
        p = p->Next;
        count++;
    }
    //加入k大于链表长度,非法
    if(k > count){
        return NULL;
    }
    //删除尾节点
    if(k == 1){
        p = *head;
        int i=1;
        while(i<(count-1)){
            p = p->Next;
            i++;
        }
        q = p->Next;
        delete q;
        q = NULL;
        p->Next = NULL;
        return *head;
    }
    //删除头节点
    if(k == count){
        p = *head;
        q = p->Next;
        delete p;
        p = NULL;
        return q;
    }

    else{
        p = *head;
        while(p != NULL && (count-k-1) > num){
            num++;
            p = p->Next;
        }
        q = p->Next;
        p->Next = q->Next;
        delete q;
        q = NULL;
    }

    return p;
}

void Print(ListNode** head,int k){
    if(*head == NULL || k <= 0){
        return;
    }

    ListNode* first = *head;
    int length = 0;
    for(int i=0;i<k-1;++i){
        if(first->Next != NULL){    //这是关键步骤!!
            first = first->Next;
            length++;
        }
        else{
            return;
        }
    }

    ListNode* second = *head;
    while(first->Next != NULL){
        first = first->Next;
        length++;
        second = second->Next;
    }

    cout << second->data << endl;

}

int main()
{
    ListNode* head = new ListNode;
    ListNode* One = new ListNode;
    ListNode* Two = new ListNode;
    ListNode* tail = new ListNode;

    head->data = 0;
    head->Next = One;
    One->data = 1;
    One->Next = Two;
    Two->data = 2;
    Two->Next = tail;
    tail->data = 3;
    tail->Next = NULL;

    int k;

    cin >> k;

/*
    ListNode* p = DeleteKnode(&head,k);

    while(p != NULL){
        cout << p->data << " ";
        p = p->Next;
    }
*/

    Print(&head,k);

    return 0;
}

 

转载于:https://www.cnblogs.com/wn19910213/p/3723347.html

标签:head,NULL,ListNode,Next,链表,节点,数据结构,倒数第
来源: https://blog.csdn.net/weixin_30462049/article/details/97546155

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有