双向链表的建立和反序

链表以前一直没有自己手写过,发现程序这个东西,一定的自己动手练习,才会掌握的比较牢固。所以今天就自己动手写了双向链表的建立和反序。记录一下

#include <stdio.h>
#include <malloc.h>
typedef struct _node
{
int data;
struct _node *pre;
struct _node *next;
}Node,*pNode;
pNode head = NULL;
void creatHead()
{
  int temp;
  pNode pnode;
  if(head == NULL)
  {
  pnode = (Node *)malloc(sizeof(Node));
  pnode->data = 100;
  pnode->pre = NULL;
  pnode->next = NULL;
  head = pnode;
  }
  for(temp = 0;temp < 5;temp++)
  {
  pNode tempnode = (Node *)malloc(sizeof(Node));
  tempnode->data = temp;
  tempnode->pre = pnode;
  tempnode->next = NULL;
  pnode->next = tempnode;
  pnode = tempnode;
  }
}
void fanzhuan(pNode headnode)
{
  pNode prenode = NULL;
  pNode pnext = NULL;
  pNode pnode = headnode;
  while(pnode)
  {
  pnext = pnode->next;
  if(pnext == NULL)
  {
  head = pnode;
  pnode->pre = NULL;
  }
  pnode->next = prenode;
  pnode->pre = pnext;
  prenode = pnode;
  pnode = pnext;
  }
}
void printnode(pNode headnode)
{
  pNode pnode;
  pnode = headnode;
  while(pnode)
  { 
  printf("node data=%d\n",pnode->data);
  pnode = pnode->next;
  }
}
void main()
{
creatHead();
printnode(head);
fanzhuan(head);
printnode(head);
}

### 如何按顺序构建单向或双向链表 #### 构建单向链表 单向链表中的每个节点包含两个部分:一个是存储数据的数据域,另一个是指向下一个节点的指针域。以下是构建单向链表的方法: 在 Java 中可以通过定义一个 `Node` 类来表示链表节点,并通过头节点(head)来维护整个链表的状态。 ```java class ListNode { int val; ListNode next; ListNode(int val) { this.val = val; this.next = null; } } public class SinglyLinkedList { ListNode head; // 插入新节点到链表末尾 public void addLast(int value) { ListNode newNode = new ListNode(value); if (head == null) { head = newNode; // 如果链表为空,则设置头节点为新节点 } else { ListNode current = head; while (current.next != null) { // 遍历至最后一个节点 current = current.next; } current.next = newNode; // 将新节点链接到最后一个节点之后 } } // 打印链表内容 public void printList() { ListNode temp = head; while (temp != null) { System.out.print(temp.val + "->"); temp = temp.next; } System.out.println("null"); } } ``` 上述代码展示了如何按顺序构建单向链表并打印其内容[^2]。 --- #### 构建双向链表 双向链表除了具有指向下一个节点的指针外,还额外增加了一个指向前一个节点的指针。这使得可以在正反方向上遍历链表。 同样,在 Java 中可以定义一个带有前后指针的 `DoublyListNode` 类,并通过类似的逻辑操作链表。 ```java class DoublyListNode { int val; DoublyListNode prev; DoublyListNode next; DoublyListNode(int val) { this.val = val; this.prev = null; this.next = null; } } public class DoublyLinkedList { DoublyListNode head; // 向链表末尾添加新节点 public void addLast(int value) { DoublyListNode newNode = new DoublyListNode(value); if (head == null) { head = newNode; // 若链表为空,则直接将新节点设为首节点 } else { DoublyListNode current = head; while (current.next != null) { // 寻找链表最后位置 current = current.next; } current.next = newNode; // 新增节点接在原链表末端 newNode.prev = current; // 设置新增节点的前驱指针 } } // 打印链表内容 public void printListForward() { DoublyListNode temp = head; while (temp != null) { System.out.print(temp.val + "<->"); temp = temp.next; } System.out.println("null"); } // 反序打印链表内容 public void printListBackward() { DoublyListNode temp = head; if (temp == null) return; // 移动到链表尾部 while (temp.next != null) { temp = temp.next; } // 开始逆序打印 while (temp != null) { System.out.print(temp.val + "<->"); temp = temp.prev; } System.out.println("null"); } } ``` 以上代码实现了双向链表的构建及其正序反序打印功能[^4]。 --- #### 解析方法 对于单向链表双向链表,解析通常涉及遍历链表以访问各个节点的内容。具体来说: - **单向链表**:从头节点开始逐一向后移动直到遇到空指针为止。 - **双向链表**:既可以从前向后也可以从后向前进行遍历。 例如,上面展示的 `printList()` `printListForward()/printListBackward()` 方法分别用于解析单向链表双向链表的内容[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值