和我一起迎接明天的太阳吧

klaus08

焦虑源于行动的匮乏

JZ15 反转链表

原题链接


描述

输入一个链表,反转链表后,输出新链表的表头。


示例

输入:{1,2,3}
返回值:{3,2,1}

思路

要把链表反转,就是把从第一个结点开始遍历,依次把每个结点放在当前链表中的头结点位置,保证每次处理的结点之前子的链表是已经反转了的,直到遍历完为止。

作图的话就是这样。0号结点是为了便于处理新建的附加头节点,如果要把2号结点放在当前链表的头结点位置,首先要保存附加头节点后面的内容,然后让附加头结点指向2号结点,2号结点再指向刚刚保存的附加头结点后面的内容,也就是已经反转过的链表。


解答

public class Solution {
    public static ListNode ReverseList(ListNode head) {
        ListNode cur = head;
        ListNode pro = new ListNode(-1);

        while (cur != null){
            ListNode phead = cur;//要插到头结点的结点
            cur = cur.next;
            ListNode tmp = pro.next;
            pro.next = phead;
            phead.next = tmp;
        }
        return pro.next;
    }
}

解答

class Solution {
    public ListNode reverseList(ListNode head) {

        if (head == null) return null;

        ListNode addHead = new ListNode(-1);
        addHead.next = head;
        ListNode pre = head, cur = head.next;

        while (cur != null) {
            pre.next = cur.next;
            cur.next = addHead.next;
            addHead.next = cur;
            cur = pre.next;
        }
        return addHead.next;
    }
}
posted @ 2021-07-19 10:21  klaus08  阅读(38)  评论(0)    收藏  举报