题目:
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
迭代法:
该题迭代法主要思想是从头到尾依次改变指针的方向。
-
设置3个指针(java无指针,这里暂且称指针)pre,cur,nextNode,初始值如下图:
-
开始循环修改指针,nextNode指针是为了记录断开后的首结点,而pre指针是为了记录指针将要指向的结点。(图上3有误,应为cur = nextNode)
-
终止条件如下图,当nextNode=null时,终止循环。
-
最后直接将cur.next指向pre,返回cur。
参考代码:
public static ListNode reverseList(ListNode head) {
//注意判断是否为null
if(head == null || head.next == null)return head;
//初始化各个指针
ListNode pre = null;
ListNode curr = head;
ListNode nextNode = curr.next;
//开始改变指针
while(nextNode != null){
curr.next = pre;
pre = curr;
curr = nextNode;
nextNode = nextNode.next;
}
curr.next = pre;
return curr;
}
递归法:
public static ListNode reverseList(ListNode head) {
if(head == null || head.next == null)return head;
//递归到最后一个节点时,返回该节点
ListNode p = reverseList(head.next);
//将指针转向
head.next.next = head;
//去掉环
head.next = null;
//每次递归都将最后一个节点返回,最后返回的p就为变换后的首节点
return p;
}