题解 | #反转链表#

反转链表

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

第一种方法是用了栈的先入后出的思想来反转链表。
/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
import java.util.*;
public class Solution {
    public ListNode ReverseList(ListNode head) {
        
        if(head == null){
            return head;
        }
        //使用list来充当栈
        ArrayList<ListNode> stack = new ArrayList();
        while(head != null){
            stack.add(0, head);
            head = head.next;
        }
        
        //保留最终返回的头结点
        ListNode rtHead = stack.get(0);
        ListNode node = rtHead;
        //出栈,按顺序设置节点
        for(int i = 1; i < stack.size(); i++){
            node.next = stack.get(i);
            node = node.next;
        }
        //末尾节点的next设置为空
        node.next = null;
        return rtHead;
    }
}

第二种就是按照正常思路来反转链表。
1.先保存当前节点的next节点。
2.将当前节点的next指针指向pre节点。
3.将当前节点设置为pre节点。
4.继续遍历下一个节点(用1里面保存的节点);

public class Solution {
    public ListNode ReverseList(ListNode head) {
        
        ListNode pre = null;
        ListNode nxt = null;
        while(head != null){
            //1.首先保留next节点
            nxt = head.next;
            //2.将当前节点的next指向上一个节点(反转)
            head.next = pre;
            //3.当前节点对于下一个节点来说也是pre节点
            pre = head;
            //4.指针顺移
            head = nxt;
        }

        //while的退出条件是head == null,所以返回当前节点的pre则是反转后的头结点
        return pre;
    }
}






全部评论

相关推荐

评论
2
收藏
分享
牛客网
牛客企业服务