链表逆序的循环实现和递归实现
链表逆序:
一个链表的结点结构
struct Node
{
int data ;
Node *next ;
};
typedef struct Node Node ;
已知链表的头结点head,写一个函数把这个链表逆序 ( Intel)。
链表逆序是笔试中链表测试的经典题,这次自己写了一下代码,分别用循环和递归方法做两种实现,记录在此。
1
#include <iostream>
2 using namespace std;
3
4 struct Node
5 {
6 int data ;
7 Node *next ;
8};
9 // 链表反序的循环实现
10 Node * ReverseList(Node *head)
11 {
12 Node * p1 = NULL;//p1代表链表被反序好的部分的头结点
13 Node * p2 = head;//p2代表链表还没有被反序部分的头结点
14 while(p2)
15 {
16 Node * pTemp = p2->next;
17 p2->next = p1;
18 p1 = p2;
19 p2 = pTemp;
20 }
21 return p1;
22}
23 // 链表反序的递归实现
24 Node * ReverseList_DG(Node *head,Node * last=NULL)
25 {
26 //last代表链表被反序好的部分的头结点,head代表链表还没有被反序部分的头结点
27 if (head == NULL) return last;
28 Node * pTemp = head->next;
29 head->next = last;
30 ReverseList_DG(pTemp,head);
31}
32
33 int main( int argc, char* argv[])
34 {
35 Node * pHead = new Node,*pTemp;
36 pHead->data = 0;
37 pHead->next = NULL;
38 for (int i=1;i<10;++i)
39 {
40 pTemp = new Node;
41 pTemp->data = i;
42 pTemp->next = pHead;
43 pHead = pTemp;
44 }
45 //打印出原始链表
46 pTemp = pHead;
47 while(pTemp)
48 {
49 cout<<pTemp->data<<",";
50 pTemp = pTemp->next;
51 }
52 cout<<endl;
53 //循环法反序链表并输出
54 pHead = ReverseList(pHead);
55 pTemp = pHead;
56 while(pTemp)
57 {
58 cout<<pTemp->data<<",";
59 pTemp = pTemp->next;
60 }
61 cout<<endl;
62 //递归法反序链表并输出
63 pHead = ReverseList_DG(pHead);
64 pTemp = pHead;
65 while(pTemp)
66 {
67 cout<<pTemp->data<<",";
68 pTemp = pTemp->next;
69 }
70 cout<<endl;
71
72 return 0;
73}
2 using namespace std;
3
4 struct Node
5 {
6 int data ;
7 Node *next ;
8};
9 // 链表反序的循环实现
10 Node * ReverseList(Node *head)
11 {
12 Node * p1 = NULL;//p1代表链表被反序好的部分的头结点
13 Node * p2 = head;//p2代表链表还没有被反序部分的头结点
14 while(p2)
15 {
16 Node * pTemp = p2->next;
17 p2->next = p1;
18 p1 = p2;
19 p2 = pTemp;
20 }
21 return p1;
22}
23 // 链表反序的递归实现
24 Node * ReverseList_DG(Node *head,Node * last=NULL)
25 {
26 //last代表链表被反序好的部分的头结点,head代表链表还没有被反序部分的头结点
27 if (head == NULL) return last;
28 Node * pTemp = head->next;
29 head->next = last;
30 ReverseList_DG(pTemp,head);
31}
32
33 int main( int argc, char* argv[])
34 {
35 Node * pHead = new Node,*pTemp;
36 pHead->data = 0;
37 pHead->next = NULL;
38 for (int i=1;i<10;++i)
39 {
40 pTemp = new Node;
41 pTemp->data = i;
42 pTemp->next = pHead;
43 pHead = pTemp;
44 }
45 //打印出原始链表
46 pTemp = pHead;
47 while(pTemp)
48 {
49 cout<<pTemp->data<<",";
50 pTemp = pTemp->next;
51 }
52 cout<<endl;
53 //循环法反序链表并输出
54 pHead = ReverseList(pHead);
55 pTemp = pHead;
56 while(pTemp)
57 {
58 cout<<pTemp->data<<",";
59 pTemp = pTemp->next;
60 }
61 cout<<endl;
62 //递归法反序链表并输出
63 pHead = ReverseList_DG(pHead);
64 pTemp = pHead;
65 while(pTemp)
66 {
67 cout<<pTemp->data<<",";
68 pTemp = pTemp->next;
69 }
70 cout<<endl;
71
72 return 0;
73}