链表学习二:链表反转与查找倒数第K个

 1 //单链表反转
 2 ListNode* RevertList(ListNode* m_pHead){
 3     ListNode* pCurrent = m_pHead;
 4     ListNode* pPrev=NULL;
 5     ListNode* pNext =NULL;
 6
 7     while (pCurrent != NULL)
 8     {
 9         pNext = pCurrent->m_pNext;
10         pCurrent->m_pNext = pPrev;
11         pPrev = pCurrent;
12         pCurrent = pNext;
13     }
14     return pPrev;
15 }

查找倒数第K个:设置两个指针p1,p2,首先p1和p2都指向链表的头部head,然后p2向前走k步,这样p1和p2之间就间隔k个节点,最后p1和p2同时向前移动,直至p2走到链表末尾,然后返回p1就是我们要找的链表的倒数K个节点。

//查找第倒数第K个
ListNode *theKthofList(ListNode* m_pHead, int k){
    ListNode* pBack;
    ListNode* pPre;
    pBack= m_pHead;
    pPre= m_pHead;
    for (; k>0; k--){
        pPre= pPre->m_pNext;      //移动pPre到与pBack距离k个位置
    }
    while (pPre!= NULL){
        pBack= pBack->m_pNext;     //移动p1,pPre直到pPre到达最后
        pPre= pPre->m_pNext;

    }
    return pBack;
}
时间: 2024-11-09 23:45:45

链表学习二:链表反转与查找倒数第K个的相关文章

数据结构与算法-链表查找倒数第K个值

查找链表中倒数第k个结点题目:输入一个单向链表,输出该链表中倒数第k个结点.链表的倒数第0个结点为链表的尾指针.链表结点定义如下: struct ListNode { int m_nKey; ListNode* m_pNext; }; int FindCoundDownInList(pListNode head,int num) { pListNode p1,p2; p1=p2=head; while(num-->0 && p1!=NULL) p1=p1->m_pNext; i

单链表中查找倒数第K个节点

// 查找链表的倒数第K个结点 PSListNode FindLastKNode(PSListNode pHead, int K ) { PSListNode pFast = pHead ; PSListNode pSlow = pHead ; if (pHead == NULL || K <= 0) { return NULL ; } while (--K ) { if (pFast == NULL ) { return NULL ; } pFast = pFast->pNext; } wh

查找单链表的倒数第k个值

刚开始,我想到的是一种笨方法,先遍历单链表,计算出单链表的长度len,然后再从头遍历单链表到第len-k个节点,那么 这个节点既是单链表的倒数第k个节点. 不过这种算法时间复杂度挺高的,还有一种更简单的方法,就是设置两个指针,分别指向单链表的头节点,然后让其中一个指针,先走k步, 之后,再让两个指针同时走,直到第一个指针走到单链表尾节点结束. 那么,第二个指针所指向的节点,就是倒数第k个节点. 代码如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1

链表(5)----查找链表倒数第K个节点

1.链表定义 typedef struct ListElement_t_ { void *data; struct ListElement_t_ *next; } ListElement_t; typedef struct List_t_{ int size; int capacity; ListElement_t *head; ListElement_t *tail; } List_t; 2.查找链表第K个节点数据 设置快慢指针,快指针超前慢指针k-1个节点,然后快慢指针再同时遍历链表,当快指

算法题:求链表倒数第K个结点

说明:本文仅供学习交流,转载请标明出处,欢迎转载!  题目:给出一个单链表,返回倒数第K个结点,最后一个结点为倒数第1个. <剑指offer>上面给的解法是设置两个指针,这里记为p1.p2,先让p2走(k-1)步,然后p1.p2同时走,当p2走到最后一个结点时,p1所指向的结点就是倒数第k个结点. 我觉得按照这样的逻辑写代码反而更容易出错,因为我们需要把我两件重要的问题:(1).p2先走(k-1)步:(2)循环结束的条件是p2到达最后一个结点,即p2->next==NULL.显然这样不太

IT公司100题-13-求链表中倒数第k个结点

问题描述: 输入一个单向链表,输出该链表中倒数第k个结点.链表倒数第0个节点为NULL. struct list_node { int data; list_node* next; }; 分析: 方法1: 首先计算出链表中节点的个数n,然后倒数第k个节点,为正数n-k+1个节点. 需要遍历链表2次. 方法1代码实现: 1 // 13_1.cc 2 #include <iostream> 3 using namespace std; 4 5 struct list_node { 6 int da

[算法]找出单链表中的倒数第k个元素

找出单链表中的倒数第k个元素 解题思路: 为了求出链表中的倒数第k个元素,最容易想到的方法是首先遍历一遍单链表,求出整个单链表的长度n,然后将倒数第k个,转换为正数第n-k个,接下去遍历一次就可以得到结果.不过这种方法需要对链表进行两次遍历,第一次遍历用于求解单链表的长度,第二次遍历用于查找正数第n-k个元素. 如果沿从头至尾的方向从链表中的某个元素开始,遍历k个元素刚好到达链表尾,那么元素就是要找的倒数第k个元素.设计如下:依次对链表的每一个结点元素进行这样的测试,遍历k个元素,查看是否到达链

如何找出单链表中的倒数第k个元素

(1)方法1:首先遍历一遍单链表,求出整个单链表的长度n,然后将倒数第k个,转换为正数第n-k个,接下去遍历一次就可以得到结果.但该算法需要对链表进行两次遍历,第一次遍历用于求解单链表的长度,第二次遍历用于查找正数第n-k个元素. (2)方法2:如果沿着从头到尾的方向,从链表中的某个元素开始,遍历k个元素后刚好达到链表尾,那么该元素就是要找的倒数第k个元素.根据这一性质,可以设计如下算法:从头节点开始,一次对链表的每一个节点元素进行这样的测试,遍历k个元素,查看是否到达链表尾,直到找到那个倒数第

9.链表中倒数第k个结点

http://zhedahht.blog.163.com/blog/static/2541117420072114478828/ 题目:输入一个单向链表,输出该链表中倒数第k个结点.链表的倒数第0个结点为链表的尾指针.链表结点定义如下: struct ListNode { int m_nKey; ListNode* m_pNext; }; 分析: 为了得到倒数第k个结点,很自然的想法是先走到链表的尾端,再从尾端回溯k步.可是输入的是单向链表,只有从前往后的指针而没有从后往前的指针.因此我们需要打