用递归的方法反转一个不头结点的单链表
// 定义单链表结点结构
typedef struct t_linkNode
{
struct t_linkNode* next;
int data;
}myNode;
// 用递归的方法反转链表
myNode* xxx_reverse(myNode* head)
{
if (head == NULL || head->next == NULL)
{
return head;
}
// 先处理首结点外的所有结点链L1
myNode* newhead = xxx_reverse(head->next);
// 处理1链与首结点的关系
head->next->next = head;
head->next = NULL;
return newhead;
}
// 定义打印链表的函数
void xxx_print(myNode* head)
{
while (head != NULL)
{
cout << head->data << "-->";
head = head->next;
}
cout << "NULL" << endl;
}
void test()
{
// 创建不头结点的链表:5->4->3->2->1->NULL
myNode p5{ NULL,5 };
myNode p4{ &p5,4 };
myNode p3{ &p4,3 };
myNode p2{ &p3,2 };
myNode p1{ &p2,1 };
xxx_print(&p1);
myNode* p = xxx_reverse(&p1);
xxx_print(p);
}
用迭代的方法实现链表的反转
typedef struct t_linkNode
{
struct t_linkNode* next;
int data;
}myNode;
// 迭代方法实现链表反转
// 1、先创建辅助指针,辅助指针永远指向head的下一结点:ptemp=head.next;
// 2、再创建指向新链表的指针,刚开始时pNew指向空:pNew=NULL;
// 3、当head!=NULL时,循环以下操作
// 01、将原链表首结点摘出来,将其插入pNew链表首元结点位置
// 02、完成头插后更新:pNew=head;head=ptemp;ptemp=ptemp.next;
myNode* xxx_reverse_1(myNode* head)
{
if (head == NULL || head->next == NULL)
{
return NULL;
}
// 创建辅助指针ptemp,用来记录原链表次元结点
// 创建新链表指针pNew,初始值为空链表,故pNew初始值为NULL
myNode* ptemp = head->next;
myNode* pNew = NULL;
// 当原链表仍存在结点,则进行以下循环操作
while (head != NULL)
{
// 将head首元结点摘下,并将其头插至新链表pNew
head->next = pNew;
// 更新pNew,head,ptemp的值
pNew = head;
head = ptemp;
if (ptemp != NULL)
{
ptemp = ptemp->next;
}
}
return pNew;
}