题目:输入一个链表,反转链表后,输出新链表的表头。
分析:
方法(1):更改next指针域法。当没有节点或者只有一个结点时,直接返回这个节点;否则至少有两个节点时,用三个指针n1,n2,n3,n1指向第一个节点,n2指向第二个节点,n3指向第三节点(可能为空),每次修改n2的next让其指向n1,然后利用n3保存下一个节点,然后利用n2移动n1和n2的相对位置(需要注意的是,最开始要将n1的next域置空,因为它反转后要做尾节点)。
ListNode* ReverseList(ListNode* pHead) {
//没有节点,或者只有一个节点,则就返回这个节点
if (pHead == NULL || pHead->next == NULL)
return pHead;
//来到这说明至少有2个节点
ListNode* n1 = pHead;//n1指向第一个节点
ListNode* n2 = n1->next;//n2指向第二个节点
n1->next=nullptr;//反转后第一个节点要做尾节点,因此它的next指向nullptr
ListNode* n3 = n2->next;//n3指向第三个节点(可能为空)
while (n2 != NULL)//因为每次修改的是n2的next指向,因此当n2为空时,n1是头结点
{
n2->next = n1;
n1 = n2;
n2 = n3;
if (n3 != NULL)
{
n3 = n3->next;
}
}
return n1;
}
方法(2):头插法。让