反转链表

之前在网上看到一道题,如何将一个链表反转,当时没有实践做,现在来写一下。有些东西不当时写下来过段时间就会容易忘掉
首先我们先来创建一个单链表,这里我们选择尾插法来构建

struct node
{
    int num;
    struct node * next;
};
int main()
{
    node *head;
    node *s, *p, *r;
    head = (node *)malloc(sizeof(node));
    r = head;
    int num_list[10] = {0,1,2,3,4,5,6,7,8,9};
    for (int i=0;i<10;i++)
    {
        s = (node *)malloc(sizeof(node));
        s->num = num_list[i];
        r->next = s;
        r = s;
    }
    r->next = NULL;
}
printf("反转前:");
while (curr!=NULL)
{
	printf("%d ", curr->num);
    curr=curr->next;
}

接下来进行反转。反转的时候需要3个指针。一个指针用来指向反转后的链表,命名为newl,一个指针用来记录当前节点,命名为curr,一个指针用来记录当前节点的下一个节点。命名为pnext,这是因为你在将当前节点反转之后,就会失去下一个节点,所以需要提前进行记录一下。下面来看代码

node *curr = head->next, *pnext;
node *newl = (node *)malloc(sizeof(node));
newl->next = NULL;
curr = head->next;
while (curr!= NULL)
{
    pnext = (node *)malloc(sizeof(node));
    pnext = curr->next;
    curr->next = newl->next;
    newl->next = curr;
    curr = pnext;
}
pnext = newl->next;
printf("反转后:");
while (pnext!=NULL)
{
    printf("%d ", pnext->num);
    pnext=pnext->next;
}

最后我们看一下输出结果
在这里插入图片描述
不过这样进行反转会将原链表进行损坏,如果不想原链表损坏,可以直接开辟一个新的链表,这个方法我会在以后补充进来。


来更新了,不过是用python写的

class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None


def ReverseList(pHead):
    # write code here
    p, q, r = pHead, None, None
    while p is not None:
        q = p.next
        p.next = r
        r = p
        p = q
    return r
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值