求链表的倒数第K个节点,如果K大于链表长度则返回NULL
2013-04-30 21:21
330 查看
/* 思路:两个指针变量p1,p2,开始都指向头结点 p1先向前移动K个位置,如果已经为NULL,则返回NULL 否则,p2也开始跟p1一起向后移动,因为p1比p2快K个位置 所以当,p1指向结束位置时,p2刚好指向倒数第K个位置 */ #include <stdio.h> #include <stdlib.h> #include <assert.h> #include <iostream.h> struct ListNode { int data; ListNode* next; }; void InitList(ListNode** head) { *head = (ListNode*)malloc(sizeof(ListNode)); (*head)->next = NULL; } void InsertList(ListNode* head,int d) { assert(head!=NULL); ListNode* pNewNode = (ListNode*)malloc(sizeof(ListNode)); pNewNode->data = d; pNewNode->next = head->next; head->next = pNewNode; } void PrintList(ListNode* head) { if(head == NULL) { return ; } ListNode* Next = head->next; while(Next!=NULL) { cout<<Next->data<<endl; Next = Next->next; } } /* 查找倒数第K个结点的核心代码, */ ListNode* theBackKthNode(ListNode* head,int k) { if(NULL == head || k<=0) { return NULL; } ListNode* p1 = head; ListNode* p2 = head; while(NULL!=p1 && k>1) { p1 = p1->next; k--; } if(p1==NULL) { return NULL; } while(NULL!=p1->next) { p2 = p2->next; p1 = p1->next; } return p2; } int main() { ListNode* pListHead = NULL; ListNode* theKth = NULL; int k=8; InitList(&pListHead); for(int i=9;i>=0;i--) { InsertList(pListHead,i); } theKth = theBackKthNode(pListHead,k); cout<<"所有的结点为:"<<endl; PrintList(pListHead); cout<<"倒数第"<<k<<"个结点是"<<theKth->data<<endl; return 0; }
相关文章推荐
- 【算法之链表(一)】判断单链表中是否有环、环的长度、环的入口节点,单链表的倒数第K个节点等
- 查找链表中倒数第k个节点,若查找成功,返回数据域的值
- 求未知长度单链表中倒数第k个节点
- java,返回链表中倒数第K个节点
- 给定一个单链表,从链表返回一个随机节点的值。 每个节点必须具有相同的选择概率。 跟进: 如果这个链表非常大,而且它的长度不为人知呢? 你能解决这个问题,而不使用额外的空间?
- 寻找链表的倒数第k个节点
- 单链表查找倒数第K个节点
- 数据结构-链表中倒数第K个节点
- 剑指Offer--14.链表中倒数第k个节点
- 单链表查找倒数第k个节点
- 求链表的倒数第k个节点
- 15_链表中倒数第k个节点
- 面试题15:链表中倒数第k个节点(Leetcode-19:Remove Nth Node From End of List)
- 华为OJ题目(十九):输出单链表倒数第K个节点
- 求链表倒数第K个节点
- 单链表查找倒数第k个节点
- C语言实现输出链表中倒数第k个节点
- 求链表的倒数第k个节点
- 算法与数据结构面试题(13)-求链表倒数第K个节点
- 逆置/反转单链表+查找单链表的倒数第k个节点,要求只能遍历一次链表