前言
在学习数据结构的过程中,学习到链表这一块,为了加深印象,自己从leetcode上发现了比较经典的题目如下:
思路分析(基于迭代法)
(这里prev是你要指向的结点,curr为当前结点)
可以看到,我们先从第一个结点出发,其指针域prev要指向null,这里假设node1为当前结点curr,所以要curr.pnext=prev,但在做这一步之前,我们要先保存一下curr.pnext,也就是
ListNode next=curr.pnext,好了,第一个结点反转完毕,接着下一个,当前结点变为node2,故,prev=curr;curr=next;依次循环下去。
代码实现-c版本
#include<stdio.h>
#include<stdlib.h>
typedef struct ListNode{
int val;
struct ListNode *pnext;
}ListNode;
ListNode *ReverseList(ListNode*head){
ListNode *prev = NULL;
ListNode *curr = head;
while (curr)
{
ListNode *next = curr->pnext;
curr->pnext=prev;
prev=curr;
curr=next;
}
return prev;
}
void display(ListNode *head){
ListNode* temp=head;
while (temp) {
printf("%d ",temp->val);
temp=temp->pnext;
}
}
int main(void){
ListNode *p1=(ListNode*)malloc(sizeof(ListNode));
ListNode *p2=(ListNode*)malloc(sizeof(ListNode));
ListNode *p3=(ListNode*)malloc(sizeof(ListNode));
p1->val=1;
p1->pnext=p2;
p2->val=2;
p2->pnext=p3;
p3->val=3;
p3->pnext=NULL;
printf("初始链表为:\n");
display(p1);
ListNode *pp=ReverseList(p1);
printf("\n");
printf("反转后链表为:\n");
display(pp);
free(p1);
free(p2);
free(p3);
return 0;
}
c 运行结果
代码实现-java 版本
package node;
class ListNode{
int val;
ListNode pnext;
ListNode(int val, ListNode pnext){
this.val=val;
this.pnext=pnext;
}
static void display(ListNode head){
ListNode temp=head;
while(temp!=null){
System.out.print(temp.val+" ");
temp=temp.pnext;
}
System.out.println();
}
public static ListNode ReverseList(ListNode head) {
ListNode prev=null;
ListNode curr=head;
while(curr!=null){
ListNode next=curr.pnext;
curr.pnext=prev;
prev=curr;
curr=next;
}
return prev;
}
}
public class Node {
public static void main(String args[]){
ListNode node3=new ListNode(3,null);
ListNode node2=new ListNode(2,node3);
ListNode node1=new ListNode(1,node2);
System.out.println("初始化链表为:");
ListNode.display(node1);
System.out.println("反转后链表为:");
ListNode reverse=ListNode.ReverseList(node1);
ListNode.display(reverse);
}
}