逆置双向链表 Reverse a doubly linked list

本文介绍了一种双向链表的反转方法,并提供了详细的实现步骤及代码示例。通过调整每个节点的前后指针来完成反转过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

逆转单链表,参见http://blog.youkuaiyun.com/ojshilu/article/details/9312239

本文是要逆转双向链表,其基本思想是一致的。只是要考虑的多一些。头尾结点都会出现NULL。

双线链表结点的结构为

   struct Node
   {
     int data;
     Node *next;
     Node *prev
   }

这是个细心活,难度不大。尤其注意两次循环前后的衔接。

代码:

Node* Reverse(Node* head)
{
    Node *p, *q;
    p = NULL;
    if(head != NULL)
        q = head->next;
    while(head != NULL)
    {
        head->next = p;
        head->prev = q;
        if(p != NULL)
            p->prev = head;
        p = head;
        head = q;
        if(q != NULL)
        {        
            q = q->next;
            head->next = p;
        }
    }
    return p;
}

上面的每次操作中,位置关系都是 …p — head — q…

为什么会死循环class Node: # 定义双链表的节点类 def __init__(self, data): self.data = data # 节点数据 self.prev = None # 前驱指针 self.next = None # 后继指针 class DoublyLinkedList: # 双链表类 def __init__(self): self.head = Node(None) # 头节点初始化,数据为None def append(self, data): # 向链表添加新节点 new_node = Node(data) if self.head.next is None: # 如果链表为空 self.head.next = new_node # 头节点指向新节点 new_node.prev = self.head # 设新节点的前驱指针 else: current = self.head while current.next: # 找到最后一个节点 current = current.next current.next = new_node # 将新节点连接到尾部 new_node.prev = current # 设新节点的前驱指针 def reverse(self): # 双链表 if self.head.next is None: # 如果链表为空,则直接返回 return current = self.head.next # 从头节点的下一个节点开始遍历 last = None # 用于保存后的最后一个节点 while current: # 遍历链表 last = current # 当前节点将成为最后一个节点 current.prev, current.next = current.next, current.prev # 交换前驱和后继指针 current = current.prev # 移动到当前节点的前驱(最初的后继) print(current) # 更新头节点指向后的新链表 self.head.next = last # 头节点指向新表头 if last: # 若链表非空 last.prev = self.head # 更新新头节点的前驱指针为头节点 # 设链表的每个节点的指针 current = last # 从新表头开始 while current: # 重新设所有节点的prev和next指针,避免持有旧的指针 print( f"Node data: {current.data} - Prev: {current.prev.data if current.prev else None}, Next: {current.next.data if current.next else None}") current = current.next print(current) # 测试代码 if __name__ == "__main__": dll = DoublyLinkedList() # 创建一个双链表 # 添加节点 for i in range(1, 6): # 向链表添加数据 1-5 dll.append(i) # 打印前的链表 print("List before reversing:") current = dll.head.next # 从头节点的下一个节点开始 while current: # 遍历并打印链表 print(current.data, end=" ") current = current.next
最新发布
03-24
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值