程序员面试宝典(19)-反转链表

题目

输入一个链表的头结点,反转该链表,并返回反转后链表的头结点。链表结点定义如下:

struct ListNode
{
int m_nKey;
ListNode* m_pNext;
};

分析

为了正确地反转一个链表,需要调整指针的指向。与指针操作相关代码总是容易出错的,因此最好在动手写程序之前作全面的分析。

为了将调整指针这个复杂的过程分析清楚,我们可以借助图形来直观地分析。假设下图中l、m和n是三个相邻的结点:

aßbß…ßl mànà…

假设经过若干操作,我们已经把结点l之前的指针调整完毕,这些结点的m_pNext指针都指向前面一个结点。现在我们遍历到结点m。当然,我们需要把调整结点的m_pNext指针让它指向结点l。但注意一旦调整了指针的指向,链表就断开了,如下图所示:

aßbß…lßm nà…

因为已经没有指针指向结点n,我们没有办法再遍历到结点n了。因此为了避免链表断开,我们需要在调整m的m_pNext之前要把n保存下来。

接下来我们试着找到反转后链表的头结点。不难分析出反转后链表的头结点是原始链表的尾位结点。什么结点是尾结点?就是m_pNext为空指针的结点。

基于上述分析,我们不难写出如下代码(JAVA版本):

    /**
     * 反转链表
     * @param pHead 头结点
     * @return
     */
    public ListNode reverseList(ListNode pHead) {
        ListNode reverseHead = null;
        ListNode pNode = pHead;
        ListNode prev = null;
        while(pNode!=null){
            //得到下一个结点,并保存它
            ListNode pNext = pNode.m_pNext;
            //如果下一个结点为null,则当前结点就是原始链表的尾结点
            if(pNext==null)
                reverseHead = pNode;
            //反转链表结点
            pNode.m_pNext = prev;
            prev = pNode;
            pNode = pNext;
        }
        return reverseHead;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值