剑指offer-反转链表

题目描述

输入一个链表,反转链表后,输出链表的所有元素。

public class Test {

    class ListNode {
        int value;
        ListNode next;
        public ListNode(int value) {
            this.value = value;
        }
    }

    public static void main(String[] args) {
        Test t = new Test();
        ListNode node1 = t.new ListNode(1);
        ListNode node2 = t.new ListNode(2);
        ListNode node3 = t.new ListNode(3);
        ListNode node4 = t.new ListNode(4);
        ListNode node5 = t.new ListNode(5);
        ListNode node6 = t.new ListNode(6);
        ListNode node7 = t.new ListNode(7);
        node1.next = node2;
        node2.next = node3;
        node3.next = node4;
        node4.next = node5;
        node5.next = node6;
        node6.next = node7;
        node7.next = null;
        ListNode reverse = t.reverseList(node1);
        while(reverse != null) {
            System.out.println(reverse.value);  // 打印反转链表
            reverse = reverse.next;
        }
    }    

    /**
     * 在调整当前处理结点的下一结点之前,将当前处理结点的下一结点保存。
     * 也就是需要三个指针,分别指向当前结点的前驱结点、当前节点和后一结点
     * @param head
     * @return
     */
    public ListNode reverseList(ListNode head) {
        if(head == null) return null;

        // 用于记录反转后的链表的头结点
        ListNode reverseNode = null;

        // 当前结点的前驱结点,也就是反转后的最后一个结点的下一结点,为null
        ListNode prev = null;

        // 当前处理的节点
        ListNode curr = head;
        while(curr != null) {

            // 记录当前处理结点的下一结点
            ListNode nextNode = curr.next;
            // 到达最后一个结点,也就是反转后的头结点
            if(curr.next == null) {
                reverseNode = curr;
            }

            // 设置当前结点的下一结点指向前驱结点
            curr.next = prev;
            // 设置当前结点为前驱结点
            prev = curr;
            // 当前结点移动到下一个结点
            curr = nextNode;
        }

        return reverseNode;  // 返回反转链表头结点
    }
}
时间: 2024-10-04 21:59:24

剑指offer-反转链表的相关文章

剑指offer——反转链表

题目描述 输入一个链表,反转链表后,输出新链表的表头. # -*- coding:utf-8 -*- # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: # 返回ListNode def ReverseList(self, pHead): # write code here if pHead==None: return None a=pHead b=pHead.n

剑指offer反转链表python

题目描述 输入一个链表,反转链表后,输出新链表的表头. 思路 定义三个指针,pHead, cur,forward 反转的时候,cur.next指向pHead,然后三个指针依次向后移动,具体过程看代码. 代码 # -*- coding:utf-8 -*- # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: # 返回ListNode def ReverseList(s

剑指offer之链表

//剑指offer 之 链表 //面试题6 从尾到头打印链表 /***************************************************************************************** 问题描述: 输入一个链表的头节点,从尾到头反过来打印出每个节点的值 链表节点定义如下: struct ListNode{ int m_nValue; ListNode* m_pNext; }; *******************************

【剑指offer】链表倒数第k个节点

转载请注明出处:http://blog.csdn.net/ns_code/article/details/25662121 在Cracking the Code Interview上做过了一次,这次在九度OJ上测试,AC. 题目描述: 输入一个链表,输出该链表中倒数第k个结点.(hint: 请务必使用链表.) 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行为两个整数n和k(0<=n<=1000, 0<=k<=1000):n代表将要输入的链表元素的

剑指offer (5) 链表插入删除

我们在操作链表的时候,必须注意以下事项: 1. 链表指针为NULL的情况 2. 插入删除涉及到 链表第一个节点时,需要修改 链表的第一个节点: a. 因为 c语言都是传值的,如果需要修改一个变量,就必须通过 指向该变量的指针(即该变量的地址) 例如:例如 修改 int a,则输入参数必须是 int* a, 修改a 则是: *a = b; (b为int) 我们需要修改一个指针时,就必须通过 该指针的地址,也就是 指向该指针的指针,即二级指针 例如  修改 int* a, 则输入参数必须是 int*

【Java】 剑指offer(22) 链表中倒数第k个结点

正文 本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入一个链表,输出该链表中倒数第k个结点.为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个结点.例如一个链表有6个结点,从头结点开始它们的值依次是1.2.3.4.5.6.这个链表的倒数第3个结点是值为4的结点. 思路 第一直觉是先从头开始遍历,计算链表个数n,然后重新遍历,第n-k+1个结点即为所需要的结点.但是需要遍历2次.后面采用了栈进行实现该

剑指offer 复杂链表的复制

题目描述: 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空) 思路:要进行深拷贝,需要每次都new一个节点出来,利用unordered_map, 2.3 138. Copy List with Random Pointer https://leetcode.com/problems/copy-list-with-random-poi

两个链表的第一个公共结点(剑指offer)+链表

两个链表的第一个公共结点 参与人数:1171时间限制:1秒空间限制:32768K 通过比例:31.25% 最佳记录:0 ms|0K(来自  running) 题目描述 输入两个链表,找出它们的第一个公共结点. 链接:http://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46?rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

剑指offer—单链表反转的三种实现方法

单链表的反转可以用递归.非递归和栈的方法实现 链表节点定义: struct ListNode{ int val; Node* next; ListNode(int x):val(x),next(nullptr){} } 1.栈 ListNode* reverseList(ListNode* head) { if(!head || !head->next) return head; stack<ListNode*>stk; //将链表的结点全部压进栈 while(head){ stk.pu

剑指Offer-题16 反转链表(Java)

问题描述:定义一个函数,输入一个链表的头结点,反转该链表并输出翻转后链表的头结点: 问题分析:为避免反转时,当前节点的next指针指向前驱lastNode,而无法继续索引其后继nextNode,故在遍历过程中,注意要同时记录其前驱与后继: 同时注意鲁棒性:如输入链表头指针为null或者只有一个节点的情况: 代码: /*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val;