反转一个单链表
/**
* 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
}
var preNode *ListNode
tmpHead := head
for(tmpHead != nil) {
tmp := tmpHead
tmpHead = tmpHead.Next
tmp.Next = preNode
preNode = tmp
}
return preNode
}
处理链表时有的人一贯思维是处理
tmp := head.Next.Next
head.Next.Next = head;
head = tmp
这种惯性思维只解决了前两个节点,而且还要处理第一个节点 最后一个节点的特殊情况,这是很难解决问题的;
我们要谨记:
- 处理链表时最多考虑两个节点 如 每次处理 tmp 和 tmp.Next
- 特殊节点在初始化时设置(如preNode 第一次为nil )。