算法记录
题目:
输入一个链表,反转链表后,输出新链表的表头
说明
一、题目
输入一个链表,反转链表后,输出新链表的表头。。
二、分析
- 链表是一个个节点链接在一起的串行结构(这里讨论单向的链表),除头结点外每个节点皆有一个子节点相连,子节点可以是null状态的,当然遇见null节点之后链表也就结束了。
- 链表的插入可以是两种:一是尾插法,插入的数据都放到最后一个节点位置,先插入的节点遍历输出时位置就靠前。二是头插法,插入的数据都放在头部,后插入的节点遍历时输出位置就靠前。
- 对一个链表进行顺序读取取出节点,再将节点采用头插法插入一个新的链表中,直到链表节点被遍历读取完,这样就完成链表的反转。
- 创建两个新链表用于保存反转链表*(pre)和接收原链表的移动(pnext),将pnext指向原链表(head)*的下一个节点位置,也就接收了除head指向的头结点外的所有节点数据,将head链接到pre的前一个节点完成头插,再将所有的节点进行一步更新,head指向next也就是下一个节点,pre节点位置上移为头结点,循环直到head指向节点为空(这个时候的next也指向null,也就不会发生空指向调用的情况),就完成单向链表的反转。
- 当然在最先接收链表的传入时应先判断是否为null或是只有一个节点,是则直接返回,不在进行下面的反转操作。
public class Solution {
public ListNode ReverseList(ListNode head) {
if(head==null || head.next==null){
return head;
}
else{
ListNode hnext;
ListNode pre = null;
while(head!=null){
hnext = head.next;
head.next = pre;
pre = head;
head = hnext;
}
return pre;
}
}
}
总结
熟悉链表的表现和操作