单链表的逆置c/c++
//定义结构体
typedef int ElemType;
typedef struct ListNode
{
Elemtype data;
ListNode *next;
}ListNode,*LinkList;
//方法1:带头节点,利用循环头插实现逆置
ListNode* reverseList1(ListNode *head)
{
ListNode *p = head->next;
head->next = NULL;
while(p!=NULL)
{
ListNode *s = p;//新创建一个结点s
p = p->next;//p一直往后移动一格直到p指向空
s->next = head->next;//新结点依次往头节点的下一位插入
head->next = s;
}
}
//方法2:不带头节点的头插法
ListNode* reverseList2(ListNode* head)
{
if(head == nullptr || head->next == nullptr)
{
return head;
}
ListNode* pre = nullptr;
ListNode* cur = nullptr;
while(head != nullptr)
{
cur = head;
head = head->next;
cur->next = pre;
pre = cur;
}
return cur;
}
//方法3:递归法
ListNode* reverseList3(ListNode* pre,ListNode* head)
{
ListNode* newhead = nullptr;
if(head != nullptr)
{
newhead = reverseList3(head,head->next);
head->next = pre;
}
else
{
newhead = pre;
}
return newhead;
}
本题主要就是分析清楚指针之间的指向关系