淘先锋技术网

首页 1 2 3 4 5 6 7

题目

反转一个单链表。

示例:

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

思路一(迭代版)

假设存在链表1->2->3->4,最直白的想法就是1<-2然后2<-3,3<-4。
实际的思路也是如此,我们只需要一个维护pre和cur节点,pre用来保存上一个节点,cur保存我们当前遍历到的节点,然后cur.next=pre不久翻转了吗,但这个时候你要记得提前保存cur.next的值,不然我们在执行cur.next=pre后就会失去下一个节点的地址。

思路一代码

	public static class ListNode {
		int val;
		ListNode next;

		ListNode(int x) {
			val = x;
		}
	}
	//迭代反转链表
	public ListNode reverseList(ListNode head) {
		ListNode pre=null;
		ListNode cur=head;
		ListNode temp;
		while(cur!=null){
			temp=cur.next;
			cur.next=pre;
			pre=cur;
			cur=temp;
		}
		
		return pre;
    }

思路二(递归版)

说实话,递归版我不好解释,直接上代码,拿着一个链表走一遍程序你就理解了。

	public static class ListNode {
		int val;
		ListNode next;

		ListNode(int x) {
			val = x;
		}
	}
	//递归反转链表
	public ListNode reverseList(ListNode head) {
		if (head == null || head.next == null) return head;
		ListNode p=reverseList(head.next);
		head.next.next=head;
		head.next=null;
		return p;
    }

再附带一份调试用的函数,通过数组生成链表:

	// 传入数组,生成链表
	public ListNode createList(int[] num) {
		if (num.length == 0)
			return null;

		ListNode head = new ListNode(num[0]);
		ListNode res = head;
		for (int i = 1; i < num.length; i++) {
			head.next = new ListNode(num[i]);
			head = head.next;
		}

		return res;
	}