链表反转c代码,链表递归排序
反转链表LeeCode206 .反转链表
给出单链表的起始节点head。 请反转链表,返回反转的链表。
解决方案1 :迭代prev指向上一个节点,初始化为nullptr,并且链表中的第一个节点指向nullptr。 cur指的是当前正在扫描的节点,其中cur-next指的是prev,而prev指的是cur。 首先,保存cur-next,用tmp保存,最后cur指向tmp。
class solution { public : listnode * reverse list (listnode * head ) { ListNode* prev=nullptr; ListNode* cur=head; 空ptr!=cur}{listnode*tmp=cur-next; cur-next=prev; prev=cur; cur=tmp; } return prev; }; 解法二:递归返回的第一个是反转链表后的头部节点reverseHead,所以保存。 之后,递归返回的节点也是这样。 递归是具有状态的循环,前面的节点指向后面的节点,所以如果后面的节点指向前面的节点,前面就不再指向它,就会被切断。
//写法一class solution (public : listnode * reverse list ) listnode*head ) if ) nullptr==head|| nullptr==head-nexexe 头-下一个-下一个=头; head-next=nullptr; return reverseHead; }; 我个人认为写法2很容易理解。 当前节点的下一个节点ListNode* tmp=cur-next; 中选择所需的族。 然后,当前节点指向前一个节点cur-next=prev,最后,当前节点cur作为前一个节点prev的参数,tmp表示当前节点cur的参数(reverse(listnode*prev,listnode ) )
//写法2 class solution (public : listnode * reverse list ) listnode*head ) returnreverse ) nullptr,head; } listnode * reverse (listnode * prev,ListNode* cur ) if ) cur==nullptr ) return prev; ListNode* tmp=cur-next; cur-next=prev; returnreverse(cur,tmp; };