输入一个链表,输出该链表中倒数第k个结点
算法思路:这道题有两种方法解决问题
1.查找倒数第k个,那么只需要求出链表的长度len,再用len-k+1就可以得到这是第几个节点,然后循环(len-k+1)次就可以找到这个节点
2.我们发现如果使用两个指针一开始都指向表头,然后其中一个指针右移k次,在进行这两个指针遍历数组的时候,当后面的指针的next指向NULL的时候,前一个指针指向的节点就是需要查找的倒数第k个节点
思路1比较简单在此就不再叙述
#include <iostream>
using namespace std;
typedef int datatype;
typedef struct list
{
datatype data;
struct list *next;
list(int x) :data(x), next(NULL) {}
}list;
list * ListInit(datatype data)
{
list *head = new list(data);
return head;
}
int insert_tail(list *head, datatype data)
{
list *newNode = new list(data);
if (NULL == head->next)
{
head->next = newNode;
return 1;
}
list *p = head->next;
while (1)
{
if (p->next == NULL)
break;
p = p->next;
}
p->next = newNode;
return 1;
}
void ListShow(list *head)
{
list *p = head;
while (1)
{
if (p == NULL)
break;
cout << p->data << '\t';
p = p->next;
}
}
//取倒数第k个
int numOfList(list *head,int k)
{
list *p = head;
list *q = head;
for (int i = 0; i < k-1; i++)
q = q->next;
while (1)
{
if (q->next == NULL)
return p->data;
q = q->next;
p = p->next;
}
}
int main()
{
list *myhead = ListInit(1);
for(int i = 2;i < 10;i++)
insert_tail(myhead, i);//尾插
ListShow(myhead);
cout << endl << numOfList(myhead, 9) << endl;
}