Q:给出一个单向链表的头指针,输出该链表中倒数第K个节点的指针,链表的倒数第0个节点为链表的尾节点(尾节点的next成员为NULL)
NODE* findnode(NODE *head,unsigned int k);
思路:首先求出单向链表的长度为Len,然后从链表头指针开始遍历,一直遍历Len-1-K次就可以找到倒数第K个节点指针。
代码实现如下:
1 #include <iostream.h> 2 #include <assert.h> 3 4 typedef struct Node 5 { 6 int data; 7 struct Node *next; 8 }Node; 9 10 //根据提供的数据创建单链表 11 Node *CreateList(int data[],int n) 12 { 13 assert(n>0); 14 Node *head=new Node; 15 head->data=data[0]; 16 head->next=NULL; 17 18 Node *p=head; 19 20 21 for (int i=1;i<n;i++) 22 { 23 Node *p1=new Node; 24 p1->data=data[i]; 25 p1->next=NULL; 26 p->next=p1; 27 p=p1; 28 } 29 30 return head; 31 } 32 33 //获取单链表的长度 34 int GetListLen(Node *head) 35 { 36 int len=0; 37 while(head) 38 { 39 len++; 40 head=head->next; 41 } 42 return len; 43 } 44 45 //选择倒数第K个节点指针 46 Node *FindNode(Node *head,int k) 47 { 48 int len=GetListLen(head); 49 if (k>len-1) 50 { 51 return NULL; 52 } 53 54 int num=len-k-1; 55 Node *p=head; 56 57 while(num) 58 { 59 p=p->next; 60 num--; 61 } 62 return p; 63 } 64 65 void main() 66 { 67 int data[5]={1,2,3,4,5}; 68 Node *head=CreateList(data,5); 69 int length=GetListLen(head); 70 cout<<length<<endl; 71 72 Node *temp=FindNode(head,2); 73 cout<<temp->data<<endl; 74 }