题目
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL
方法(1):利用三个指针n1,n2,n3,分别指向n2的指向(指向n1),n3是负责往后,n2走完后n1就是新头。需要注意的是当链表没有节点或者只有一个节点时,直接返回原链表即可。
ListNode* reverseList(ListNode* head) {
if(head==nullptr || head->next==nullptr)//没有节点或者只有一个节点
{
return head;
}
//至少有两个节点
ListNode* n1=head;//n1指向第一个节点
ListNode* n2=head->next;//n2指向第二个节点
ListNode* n3=n2->next;//可能为空
n1->next=nullptr;
while(n2)//每次该的都是n2的指向
{
n2->next=n1;
n1=n2;
n2=n3;
if(n3)
n3=n3->next;
}
return n1;
}
方法(2):头插法
ListNode* reverseList(ListNode* head) {
if(head==nullptr || head->next==nullptr)
{
return head;
}
ListNode* newnode=nullptr;
ListNode* cur=head;
while(cur)
{
ListNode* next=cur->next;
cur->next=newnode;
newnode=cur;
cur=next;
}
return newnode;
}