给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。
数据范围:
要求:空间复杂度 ,时间复杂度 。
如当输入链表{1,2,3}时,
经反转后,原链表变为{3,2,1},所以对应的输出为{3,2,1}。
以上转换过程如下图所示:
{1,2,3}
{3,2,1}
{}
{}
空链表则输出空
//判断是否为空链表,若为空链表直接返回空链表 if(head.next==null){ return head; } //头结点设置为priorNode,头结点的next设为currentNode ListNode priorNode=head; ListNode currentNode = head.next; //头结点的next设置为null head.next=null; while(currentNode.next!=null){//TODO //链表反转前记录current的下一个结点 ListNode tempNode = currentNode.next; //链表地址反转操作 currentNode.next=priorNode; //进行下一次链表反转操作前,先将prior和current向后移动以为 priorNode=currentNode; currentNode=tempNode; } //为最后一个结点执行反转操作 ListNode tempNode = currentNode.next; currentNode.next=priorNode; return currentNode;
import java.util.*; /* * public class ListNode { * int val; * ListNode next = null; * public ListNode(int val) { * this.val = val; * } * } */ public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param head ListNode类 * @return ListNode类 */ public ListNode ReverseList (ListNode head) { // write code here // 头结点为空 或者 无后继 直接返回头结点 if (head == null || head.next == null) { return head; } // 定义pre、cur和next ListNode pre = head; ListNode cur = head.next; ListNode next = cur.next; // 初始先给头结点,也就是翻转后的尾结点的next置空 pre.next = null; // 循环反转链表 while (cur != null) { next = cur.next; cur.next = pre; pre = cur; cur = next; } return pre; } }
import java.util.*; /* * public class ListNode { * int val; * ListNode next = null; * public ListNode(int val) { * this.val = val; * } * } */ public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 思路: 初始化一个新的链表节点,用于存储反转后的链表。 遍历原链表,将每个节点依次插入到新链表的头部。 返回新链表的头节点。 * * @param head ListNode类 * @return ListNode类 */ public ListNode ReverseList (ListNode head) { ListNode newHead = null; while (head != null) { ListNode nextNode = head.next; head.next = newHead; newHead = head; head = nextNode; } return newHead; } }
//采用了递归思想 public ListNode ReverseList (ListNode head) { // write code here if(head ==null ||head.next == null){ return head; } ListNode cur = ReverseList(head.next); head.next.next = head;//节点的下一个指向了自己 head.next = null;//自己的就断开 return cur; }
public ListNode ReverseList (ListNode head) { if(head == null) return null;//如果给的是空链表,直接返回空 if(head.next == null) return head;//如果给的链表只有一个节点,不用反转,直接返回 //如果链表至少是两个节点,才执行下面的代码 ListNode temp = head.next;//要反转的节点(从第二个节点开始) ListNode nextNode = temp.next;//要反转的节点的下一个节点 head.next = null;//先断开头节点和要反转节点的连接,不然反转完之后会形成环 //头插法进行反转 while (temp != null){ temp.next = head; head = temp; temp =nextNode; if(nextNode != null) nextNode = nextNode.next; } return head; }时间复杂度O(n) 空间复杂度O(1)。
import java.util.*; /* * public class ListNode { * int val; * ListNode next = null; * public ListNode(int val) { * this.val = val; * } * } */ public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param head ListNode类 * @return ListNode类 */ public ListNode ReverseList (ListNode head) { if(head==null) return null; ListNode newList = null; while(head!=null){ ListNode temp = head.next; //临时存储 head.next=newList; //改箭头 newList=head; //指针后移更新新表 head=temp; //指针后移更新旧表 } return newList; } }
import java.util.*; /* * public class ListNode { * int val; * ListNode next = null; * public ListNode(int val) { * this.val = val; * } * } */ public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param head ListNode类 * @return ListNode类 */ public ListNode ReverseList (ListNode head) { // write code here ListNode prev = null;//当前节点的上一个节点 ListNode curr = head;//当前的节点 while(curr!=null){ ListNode nextTemp = curr.next;//临时保存当前节点的下个节点 curr.next = prev;//当前节点指向上一个节点 prev = curr;//上一个节点设置成当前节点 curr = nextTemp;//当前节点设置为下个节点 } return prev; } }
public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param head ListNode类 * @return ListNode类 */ // 思路:用新头结点替换原头节点,并将原头节点后移一位,然后再次循环替换、移位,直至原头结点为空,最后返回新的头节点 public ListNode ReverseList (ListNode head) { // write code here //创建新的头节点 ListNode newHead = null; // 头节点不为空时进行循环 while(head!=null){ // 将头结点的下一个节点赋值给临时节点 ListNode temp = head.next; // 头节点指向新的头节点 head.next = newHead; // 头结点赋值给新的头节点 newHead = head; // 临时节点赋值给头结点,完成头结点后移 head = temp; } // 返回新的头节点 return newHead; } }
import java.util.*; /* * public class ListNode { * int val; * ListNode next = null; * public ListNode(int val) { * this.val = val; * } * } */ public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param head ListNode类 * @return ListNode类 */ public ListNode ReverseList (ListNode head) { // write code here //res用于保存最终结果 // ListNode res=null; // ListNode tail=res; // ListNode p=head; // while(p!=null){ // ListNode tmp=p.next; // p.next=tail; // tail=p; // p=tmp; // } // return tail; //栈 Stack<ListNode>s=new Stack<>(); ListNode p=head; while(p!=null){ s.push(p); p=p.next; } ListNode res=new ListNode(-1); ListNode tail=res; while(!s.isEmpty()){ ListNode node=s.pop(); tail.next=node; node.next=null; tail=node; } tail.next=null; return res.next; } }