题解 | 反转链表

反转链表

http://www.nowcoder.com/practice/75e878df47f24fdc9dc3e400ec6058ca

方案1 栈模拟

使用栈模拟,然后构建正确的关系(即next之间的关系)即可。

栈:先进后出,后进先出

/*
栈扫描即可
*/
public class Solution {
  	//用数组模拟栈的操作
    public ListNode[] q = new ListNode[1010];
    public ListNode ReverseList(ListNode head) {
      	//特判
        if(head == null)return head;
      	//栈的位置[当前处于哪里]
        int tt = -1;
        while(head != null){
            q[++tt] = head;
            ListNode tmp = head.next;
          	//将next置空
            head.next = null;
            head = tmp;
        }
      	//构建新的结果集
        ListNode ret = q[tt];
        while(tt > 0){
            q[tt].next = q[tt - 1];
            tt--;
        }
        return ret;
    }
}

alt

时空复杂度:O(n) O(n)

方案2 双指针

在做题的时候,我发现,只用每次重构相邻之间的next的关系就可以了,于是便想出了可以使用双指针去解决这个题,这个思路不好描述,所以我针对样例的 1-->2-->3进行模拟,如下图: alt

/*
双指针
*/
public class Solution {
    public ListNode ReverseList(ListNode head) {
        if(head == null || head.next == null)return head;
        //存储t2.next 因为要将t2.next设为t1,所以需要记录
        ListNode tmp = null;
        //相邻的两个节点
        ListNode t1 = head;
        ListNode t2 = head.next;
        do{
            tmp = t2.next;
            t2.next = t1;
            t1 = t2;
            t2 = tmp;
        }while(t2 != null);
        //头节点需要设置一下,不然在第一个节点和第二个节点会产生环
        head.next = null;
        return t1;
    }
}

时空复杂度 O(n) O(1)

全部评论

相关推荐

头像
04-29 10:53
已编辑
东北大学 自动化类
点赞 评论 收藏
转发
点赞 1 评论
分享
牛客网
牛客企业服务