面试题16:反转链表

2020-04-12  本文已影响0人  Kitlen

题目:

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

思路:

定义三个指针,分别指向当前遍历的结点pNode、它的前一个结点pPrev、它的后一个结点pNext。
1)为避免链表断开,每次遍历,先保存后一个结点pNext。如果pNext==null,证明当前结点pNode是最后一个结点,即反转链表的头节点。
2)将当前结点pNode的next指向它的前一个结点pPrev。
3)所有指针后移一位。

自述(仅自己理解):循环过程中,如果判断条件不被判断块使用,同时仅在非判断块中起作用并且非判断块的代码和判断块的代码冗余,那么判断条件无用。

解答:

class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}
public class Solution {
    public ListNode ReverseList(ListNode head) {
        ListNode pReverseHead = null;
        //三个指针:前面一位,当前,下一个指针
        ListNode pPrev = null;
        ListNode pNode = head;
        while (pNode != null) {
            //保存第三个指针
            ListNode pNext = pNode.next;
            if (pNext == null) {
                pReverseHead = pNode;
            }
            //反转指针指向
            pNode.next = pPrev;
            //向后移动位置
            pPrev = pNode;
            pNode = pNext;
        }
        return pReverseHead;
    }
}
上一篇下一篇

猜你喜欢

热点阅读