输出单链表的倒数第k个节点,其中第0个节点为尾节点,算法如下:
#include<stdafx.h>
#include<stdio.h>
#include<stdlib.h>
struct ListNode
{
int value;
ListNode* nextNode;
};
//链表创建
void createList(ListNode* &root,int a)
{
if(root==NULL)
{
root=(ListNode*)malloc(sizeof(ListNode));
root->value=a;
root->nextNode=NULL;
return;
}
ListNode* temp=(ListNode*)malloc(sizeof(ListNode));
temp->value=a;
temp->nextNode=NULL;
root->nextNode=temp;
root=root->nextNode;
return;
}
//输出链表的倒数第k节点值
void lastK(ListNode* temp,ListNode* temp1,int k)
{
int a=0;
while(temp!=NULL)
{
temp=temp->nextNode;
a++;
}
if(k>a-1)
{
printf("error\n");
return;
}
int m=a-k-1;
while(m>0)
{
temp1=temp1->nextNode;
m--;
}
printf("%d\n",temp1->value);
}
//从尾依次输出链表节点的值
void printfromLast(ListNode* temp)
{
if(temp!=NULL)
{
if(temp->nextNode!=NULL)
{
printfromLast(temp->nextNode);
}
printf("%d ",temp->value);
return;
}
return;
}
//在O(1)时间内删除特定的节点
void deleteNode(ListNode* phead,ListNode* TobeDelete)
{
if(phead==NULL||TobeDelete==NULL)
return;
if(TobeDelete->nextNode!=NULL)
{
ListNode* node=TobeDelete->nextNode;
TobeDelete->value=node->value;
TobeDelete->nextNode=node->nextNode;
delete node;
}
else
{
ListNode* node=phead;
while(node->nextNode!=TobeDelete)
node=node->nextNode;
node->nextNode=NULL;
delete TobeDelete;
}
}
int main(int argc,char**argv)
{
ListNode* root=NULL;
ListNode* temp=NULL;
int a[]={1,2,3,4,5,6};
int len=sizeof(a)/sizeof(int);
for(int i=0;i<len;i++)
{
if(root==NULL)
{
createList(root,a[i]);
temp=root;
}
else
createList(root,a[i]);
}
ListNode* t1=temp;
ListNode* t2=temp;
ListNode* temp1=temp;
printfromLast(temp1);
printf("\n");
printf("ListNode:");
while(temp!=NULL)
{
printf("%d ",temp->value);
temp=temp->nextNode;
}
printf("\n");
lastK(t1,t2,6);
return 0;
}