* Prob: 打印链表的倒数第k个节点
* Idea: 考虑各种情况:空链表,k不合法,创建链表,释放链表。
* Time: O(n)
* Space:O(n)
* Mistakes: 创建链表,指针应当先判断为空。ptr=nullptr时,访问ptr->next会报错。
* 2017-06-04
*/
#include<bits/stdc++.h>
using namespace std;
typedef struct Node{
int n;
struct Node* next;
}NODE;
NODE* add_node(NODE* pre_ptr, int data){
NODE* nd = new NODE;
nd->n = data;
nd->next = nullptr;
pre_ptr->next = nd;
return nd;
}
NODE* create_linklist(NODE*head, int length){
NODE *ptr;
ptr = new NODE;
head = ptr;
for(int i=1; i<=length; i++){
ptr = add_node(ptr, i);
}
ptr->next = nullptr;
return head;
}
void release_linklist(NODE*head){
NODE *ptr=head, *q;
while(ptr!=nullptr){
q = ptr;
delete ptr;
ptr = q->next;
}
return;
}
void print_linklist(NODE* head){
NODE* ptr = head->next;
while(ptr != nullptr){
cout<<ptr->n<<'\t';
ptr = ptr->next;
}
cout<<endl;
}
void back_k_node(NODE* head, int k){
if(head == nullptr) {cout<<"Link list is null!"<<endl; return;}
if(k <= 0) {cout<<"k should be greater than 0!"<<endl; return;}
NODE *ptr1, *ptr2;
ptr1 = ptr2 = head->next;
for(int i=0; i<k-1; i++){
if(ptr1 == nullptr) {break;}
ptr1 = ptr1->next;
}
if(ptr1 == nullptr) {cout<<k<<" is larger than the linklist size!"<<endl; return;}
while(ptr1->next != nullptr){
ptr1 = ptr1->next;
ptr2 = ptr2->next;
}
cout<<k<<"th ele is: "<<ptr2->n<<endl;
return;
}
int main(){
NODE* head = nullptr;
int num = 19;
int test_units[10] = {0, -1, -20, 5, 1, 10, 7, 11, 22, 100};
head = create_linklist(head, num);
print_linklist(head);
for(int i=0; i<10; i++)
back_k_node(head, test_units[i]);
release_linklist(head);
return 0;
}