反转单向链表

上次做查找单向链表的倒数第K个元素的时候还直接把这种反转单向链表的方案干掉了,就是嫌麻烦,结果报应不爽,还是要反转。罢了罢了,还是做做吧。

首先,我们需要先想通怎么反转一个单向链表。这个画图非我所长,草稿实在难看,所以反转的核心代码如下:

Node *p = pHead;
Node *p_next = p->next;
p->next = NULL;
while(q)
{
    Node *p_next_next = p_next->next;
    p_next->next = p;
    p = p_next;
    p_next = p_next_next;
}
pHead = p;

相信大家都能看懂,实在代码不好理解的话请一定要在草稿纸上画一下。我把整个程序的代码都贴在下面:

#include <iostream>
using namespace std;

template <typename T>
class List
{
private:
    struct Node
    {
        T val;
        Node *next;
        Node(T const& data) : val(data), next(NULL) {}
    };
    Node *pHead;
public:
    List(T const *arr,int n) : pHead(NULL)
    {
        for(size_t i = 0; i < n; ++i)
        {
            push_back(*(arr+i));
        }
    }
    void push_back(T const& data)
    {
        Node *node = new Node(data);
        if(pHead == NULL)
        {
            pHead = node;
            return ;
        }
        Node *p = pHead;
        while(p->next) p = p->next;
        p->next = node;
    }
    void rotate_list()
    {
        if(pHead == NULL) return ;
        Node *p = pHead;
        Node *p_next = p->next;
        p->next = NULL;
        while(q)
        {
            Node *p_next_next = p_next->next;
            p_next->next = p;
            p = p_next;
            p_next = p_next_next;
        }
        pHead = p;
    }
    friend ostream& operator<<(ostream& os, List const& myList)
    {
        List::Node *p = myList.pHead;
        while(p)
        {
            os << p->val << ' ';
            p = p->next;
        }
        return os;
    }
};
int main()
{
    char arr[10] = "abcdefghi";
    arr[9] = 'j';
    List<char> myList(arr,sizeof(arr)/sizeof(char));
    myList.rotate_list();
    cout << myList << endl;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值