1.整个链表翻转
题目:
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
1.1 算法思路
双指针:一个指针pre指向原链表当前节点的前一个节点,另一个指针next指向当前节点的下一个节点。
依次遍历链表的各个节点,每遍历一个节点即将其指向前一个节点(倒置),主要分4步:
1.先备份后一个节点(以防移动指针的时候找不到下一个节点):next = head.next;
2.当前节点的next指向前一个节点:head.next = pre;
3.前置节点后移一个位置到当前节点:pre = head;
4.当前节点后移一个位置到下一个节点:head = next,注意这一步(千万不要)容易忽略。
1.2 代码实现
// 节点
class Node{
int val;
Node pre;
Node next;
}
// 翻转整个链表
public Node reverseLinkedList(Node head){
// 头节点为空或则只有头节点时,返回头节点
if(head == null || head.next == null){
return head;
}
// 创建pre next,开始时,pre为null
Node pre = null, next;
while(head != null){
// 保存当前节点的下一个节点
next = head.next;
// 翻转节点,使当前节点指向前一个节点
head.next = pre;
// 后移节点,使点一个节点移到当前节点
pre = head;
// 后移节点,使当前节点移到下一个节点
head = next;
}
return pre; // 注意:当pre指向原链表的最后一个节点时,head已经指向最后一个节点的Next即空节点,所以这里应返回pre
}