反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-linked-list
递归方式O(n) Time:8ms
:
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
//递归方式反转
func reverseList(head *ListNode) *ListNode {
if head==nil||head.Next==nil{//遍历到最后一个节点
return head//返回最后一个节点
}else{
node:=reverseList(head.Next)//递归调用,反转后面的链表节点指向
head.Next.Next=head//将后一个节点指向前一个节点
head.Next=nil//将前一个节点到后一个节点的指向关系删掉
return node
}
}
直接反转O(n) Time:4ms
:
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func reverseList(head *ListNode) *ListNode {
if head==nil{
return head
}
var pre,next *ListNode//定义前驱节点和后继节点
for head!=nil{//如果没到链表尾部
next=head.Next//暂存后继节点
head.Next=pre//当前节点指针域指向前驱节点
pre=head//后移准备改变下一个节点
head=next//后移
}
return pre
}