剑指offer---反转链表

反转链表

题目描述:

定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

思路:

一、双指针迭代

设置一个pre节点开始指向null,cur节点指向当前节点,反转整个链表就是用当前节点cur指向前驱节点pre。

class Solution {
	public ListNode reverseList(ListNode head) {
		//申请节点,pre和 cur,pre指向null
		ListNode pre = null;
		ListNode cur = head;
		ListNode tmp = null;
		while(cur!=null) {
			//记录当前节点的下一个节点
			tmp = cur.next;
			//然后将当前节点指向pre
			cur.next = pre;
			//pre和cur节点都前进一位
			pre = cur;
			cur = tmp;
		}
		return pre;
	}
}

二、递归解法

递归终止条件是节点为空或者节点的下一个节点为空。

将当前节点的下一个节点指向当前节点。

即head.next.next = head ;即完成反转。

 public ListNode reverseList(ListNode head) {
        if (head == null || head.next == null) return head;
        ListNode cur = reverseList(head.next);
        head.next.next = head;
        head.next = null;
        return cur;
    }
}
posted @ 2020-04-19 10:34  杨小星儿  阅读(99)  评论(0)    收藏  举报