剑指offer 第24题 反转链表

问题描述:

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

示例:

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

限制:

0 <= 节点个数 <= 5000



解题思路:

解法一:
  使用栈先进后出的特点进行求解,遍历链表,将所有节点压入栈中,然后将节点以此弹出,形成逆序的新链表。

解法二:
  新建一个空链表,遍历给出的链表,以此将节点指向新链表的头节点。



代码实现:

解法一:

public static ListNode reverseList(ListNode head) {
    	ListNode res = new ListNode(0);
    	Stack<ListNode> stack = new Stack<ListNode>();
    	ListNode p = head;
    	while(p!=null) {
    		stack.push(p);
    		p = p.next;
    	}
    	p = res;
    	while(!stack.isEmpty()) {
    		p.next = stack.pop();
    		p = p.next;
    		//由于之前节点的next是有指向的,所以在这里必须清空,否则会出现环,即链表形成一个圆
    		p.next = null;
    	}
    	return res.next;
    }

解法一提交结果:
在这里插入图片描述

解法二:

 public static ListNode reverseList2(ListNode head) {
    	 //新链表
        ListNode newHead = null;
        while (head != null) {
           //保留出下一个节点
           ListNode temp = head.next;
           //将节点指向新链表的头
           head.next = newHead;
           //更新新链表的头,即让现在遍历到的节点成为新链表的头
           newHead = head;
           //更新旧链表的头,即把已经遍历的节点给删除
           head = temp;
        }
        //返回新链表
        return newHead;
    }

解法二提交结果:

在这里插入图片描述

©️2020 CSDN 皮肤主题: 点我我会动 设计师:上身试试 返回首页