【题目】:输入一个链表,输出该链表中倒数第K个结点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个结点。例如一个链表有6个结点,从头结点开始它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个结点是值为4的结点。 【思路】: 方法1:遍历两次链表即先算出链表的长度n,然后倒数第k个结点就是顺序的第(n-k+1)个数。 方法2:遍历一次链表即设定两个指针p1和p2,两个指针刚开始都指向链表的第一个结点,然后让p1指针先走(k-1)步,然后再让两个指针一起往后走,当p1指针指向链表最后一个结点的时候,p2指针刚好指向链表中的倒数第k个结点 。 【实现】:Node* KthNode(Node* pHead,int k) { if(pHead==NULL||k==0) return NULL; Node* pNode=pHead;//当前结点 Node* pKthNode=pHead;// while(k-1>0) { if(pNode-><span style="font-family:verdana, Arial, Helvetica, sans-serif;">next</span>!=NULL) { pNode=pNode-><span style="font-family:verdana, Arial, Helvetica, sans-serif;">n</span>ext;//让pNode先走k-1步 --k; } else return NULL; } while(pNode-><span style="font-family:verdana, Arial, Helvetica, sans-serif;">n</span>ext!=NULL) { pNode=pNode-><span style="font-family:verdana, Arial, Helvetica, sans-serif;">n</span>Next; pKthNode=pKthNode-><span style="font-family:verdana, Arial, Helvetica, sans-serif;">n</span>ext; } return pKthNode; }
类似题目
1.求链表的中间结点。如果链表中结点总数为奇数,返回中间结点;如果结点总数是偶数,返回中间两个结点的任意一个。思路是定义两个指针,同时从链表的头结点出发,一个指针一次走一步,另一个指针一次走两步。当走得快的指针走到链表的末尾时,走得慢的指针正好在链表的中间。
ListNode* MidNodeInList(ListNode* pHead) { if(pHead==NULL) return NULL; ListNode* pNode=pHead;//当前结点 ListNode* pMidNode=pHead;//中间结点 //这里的判断条件是下一个结点不为空且下下个结点也不为空 while(pNode->m_pNext!=NULL&&pNode->m_pNext->m_pNext!=NULL) { pNode=pNode->m_pNext->m_pNext; pMidNode=pMidNode->m_pNext; } return pMidNode; }
2:判断一个单向链表是否形成了环状结构。和前面的问题一样,定义两个指针,同时从链表的头结点出发,一个指针一次走一步,另外一个指针一次走两步。如果走得快的指针追上了走得慢的指针,那么链表就是环状结构;如果走得快的指针走到了链表的末尾(m_pNext指向NULL)都没有追上走得慢的指针,那么链表就不是环状结构。//判断链表中是否有环 int IsLootList(ListNode* pHead) { if(pHead==NULL) return NULL; ListNode* pFirst=pHead;//第一个指针,步长为2 ListNode* pSecond=pHead;//第二个指针,步长为1 while(pFirst->m_pNext!=NULL&&pFirst->m_pNext->m_pNext!=NULL) { pFirst=pFirst->m_pNext->m_pNext; pSecond=pSecond->m_pNext; if(pFirst==pSecond) return 1; } return 0; }
找链表中倒数第K个结点
最新推荐文章于 2019-06-25 14:31:09 发布