面试题16:反转链表
2020-04-12 本文已影响0人
Kitlen
题目:
定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。
思路:
定义三个指针,分别指向当前遍历的结点pNode、它的前一个结点pPrev、它的后一个结点pNext。
1)为避免链表断开,每次遍历,先保存后一个结点pNext。如果pNext==null,证明当前结点pNode是最后一个结点,即反转链表的头节点。
2)将当前结点pNode的next指向它的前一个结点pPrev。
3)所有指针后移一位。
自述(仅自己理解):循环过程中,如果判断条件不被判断块使用,同时仅在非判断块中起作用并且非判断块的代码和判断块的代码冗余,那么判断条件无用。
- 举例:在while条件中,我使用了pNode != null的判断条件,是因为在条件块中使用了ListNode pNext = pNode.next;
如果我在while判断使用pNode.next != null,那么条件块没有使用到该判断,而且非条件块还需要写一段冗余代码。证明此判断条件不够精准,还需提炼。
解答:
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;
}
}