【每日一道算法题】反转链表的实现

154 阅读2分钟

输入一个链表,反转链表后,输出新链表的表头。输入{1,2,3},输出{3,2,1}.

java题解:该题很明显考察的是怎么调整链表的指针,来达到我们想要的目的。
1. 反转后的链表应该为最后一个结点指向倒数第二个,倒数第二个指向倒数第三个,......,
第二个指向第一个,第一个指向null2. 现在就是需要调整每个结点的next指针。
调整过程需要两个指针辅助:
pre记录其前一个结点位置,好让该结点的next指针指向前一个结点,但是在指向前一个结点前需要用一个指针tem记录后一个结点地址,避免结点丢失。
以head节点为例:
1.反转后的head指向为null,所以未反转的时候其前一个结点应该是null,初始化pre指针为null2.用tem指针记录head的下一个结点head.next3.从链表上摘下head,即让head.next指向pre;
4.此时已完成head结点的摘取及与与一个节点的连接,则我们需要操作下一个结点:故需移动pre和head,让pre指向head,head指向下一个节点。
以此类推,直到走完所有节点也就是head指向null时循环结束。

解题如下:

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    
    public ListNode ReverseList(ListNode head) {
        //用于记录当前节点的前一个节点
        ListNode pre =null;
        //用于记录后一个节点
        ListNode tem=null;
        while(head!=null){
            //记录当前节点后一个节点
            tem=head.next;
            //将后一个节点指向前一个节点
            head.next=pre;
            //pre节点前移至当前节点
            pre=head;
            //head节点指向原本保存的后一个节点
            head=tem;
        }
        return pre;
    }
}