每日算法——反转链表(Java实现)

题目

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

示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

题目来源:力扣(LeetCode)

思路分析:

反转即是头节点指向null,原来头结点的下一个节点指向头节点,依次类推
如果头节点直接指向null的话会导致后面的节点直接丢失,所以要用一个节点来代替头结点做反转,最后返回值返回该节点作为头结点。
利用迭代:使用双指针实现
初始化一个指针cur指向头节点,另一个指针pre指向null,
每次循环需要一个临时节点temp获取当前节点的下一个节点,保证连续,
第一次循环,temp获取头节点的下一个节点:temp=cur.next
获取完之后头节点要变成尾节点即cur.next = pre,
这时候指向null的pre指针需要指向头节点(原因是原头结点要被第2个节点指向)即pre = cur 原先指向头结点的cur指针就需要指向我们获取的第2个节点,而第二个节点已经被我们用临时节点取出来了,即cur=temp.
如此迭代,当cur指向null时也就是到了原先的尾节点就跳出循环,返回pre。

请添加图片描述

代码:

//单向链表节点
public class ListNode {
    int val;
    ListNode next;
    ListNode(int x) { val = x; }
}

/**
* 反转链表的方法
* @param head 链表的头节点
* @return ListNode 一个反转后的头结点
*/
public ListNode reverseList(ListNode head) {
    ListNode cur = head;
    ListNode pre = null;
    while(cur!=null){
    	//保存当前节点下一个节点
        ListNode temp = cur.next;
        //指向前一个节点(头结点指向null)
        cur.next = pre;
        pre = cur;
        cur = temp;
    }
    //将反转后的链表头节点返回
    return pre;
}

测试

public static void main(String[] args) {
    ListNode ln1 = new ListNode(1);
    ListNode ln2 = new ListNode(2);
    ListNode ln3 = new ListNode(3);
    ln1.next = ln2;
    ln2.next = ln3;
    ln3.next = null;
    Solution s = new Solution();
    ListNode head= s.reverseList(ln1);
    ListNode temp = head;//不再对head使用可以直接用head来输出 使用建议先获取出以防找不到头节点避免了重新获取
    while (temp!=null){
        System.out.print(temp.val+" ");
        temp = temp.next;
    }
 }
//运行结果 3 2 1 
  • 12
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值