定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
示例:输入1→2→3→4→5→NULL
输出5→4→3→2→1→NULL
分析:反转后,每一个结点指向其前继结点。
1.若先改变当前结点指向,将当前结点指向其前继结点,会造成当前结点原指向丢失,链表断开,后面的节点都无法访问。因此,在改变当前结点指向之前,需要设置临时结点变量temp,保存当前结点原先的指向。
2.在当前结点改变指向之后(即由原指向改为指向前继结点),前继结点和当前结点的下标都要右移一步,准备下个结点的反转。
迭代的代码:
class Solution {
public ListNode reverseList(ListNode head) {
ListNode pre = null;
ListNode cur = head;
while(cur!=null){
ListNode temp = cur.next;//保留当前结点cur的原指向
cur.next=pre;//改变当前结点cur指向,将其指向前继结点
pre=cur;//移动前继结点pre到当前结点
cur=temp;//移动当前结点cur到后继节点
}
return pre;
}
}
除了迭代法,还有递归法和借助栈。参考leetcode