【剑指Offer】15、反转链表

题目描述

输入一个链表,反转链表后,输出新链表的表头。

题解一:栈
 1 public static ListNode ReverseList(ListNode head) {
 2         if(head==null||head.next==null){
 3             return head;
 4         }
 5         Stack<ListNode> stack = new Stack<>();
 6         ListNode current=head;
 7         while (current!=null){
 8             stack.push(current);
 9             current=current.next;
10         }
11         //关键在于这里,原来的头结点的next要置为空,否则导致遍历时无限循环
12         head.next = null;
13         ListNode backHead=stack.pop();
14         ListNode backCurrent=backHead;
15         while (!stack.isEmpty()){
16             backCurrent.next=stack.pop();
17             backCurrent=backCurrent.next;
18         }
19         return backHead;
20     }
题解二:循环调转方向
 1 //依次遍历所有节点,将所有节点的next指向前一个节点
 2     public static ListNode ReverseList02(ListNode head) {
 3         ListNode pre = null;
 4         ListNode next =null;
 5         while (head != null) {
 6             //持有下一个节点的引用
 7             next = head.next;
 8             //将当前节点对下一个节点的引用指向前一个节点
 9             head.next = pre;
10             //将前一个节点指向当前节点
11             pre = head;
12             //将当前节点指向下一个节点
13             head = next;
14         }
15 //如果head为null的时候,pre就为最后一个节点了,但是链表已经反转完毕,pre就是反转后链表的第一个节点
16         return pre;
17     }
题解三:递归
 1 public static ListNode ReverseList01(ListNode head) {
 2         if(head == null || head.next == null) {
 3             return head;
 4         }
 5         //递归找到尾部节点
 6         ListNode preNode = ReverseList01(head.next);
 7         //倒序
 8         head.next.next = head;
 9         //将正序的头节点指向空
10         head.next = null;
11         return preNode;
12     }

初始化链表:

 1 public static class ListNode{
 2         int val;
 3         ListNode next = null;
 4         ListNode(int val) {
 5             this.val = val;
 6         }
 7     }
 8 public static ListNode createList(int[] list){
 9         ListNode head = new ListNode(-1);
10         ListNode current=head;
11         for(int i=0;i<list.length;i++){
12             current.next=new ListNode(list[i]);
13             current=current.next;
14         }
15         return head.next;
16     }

测试:

 1  public static void main(String[] args) {
 2         int[] list={1,2,3,4,5,6};
 3         ListNode head = createList(list);
 4         ListNode backHead = ReverseList(head);
 5         while (backHead!=null){
 6             System.out.print(backHead.val+" ");
 7             backHead=backHead.next;
 8         }
 9     }
10 输出:6 5 4 3 2 1

原文地址:https://www.cnblogs.com/Blog-cpc/p/12393117.html

时间: 2024-11-06 12:30:21

【剑指Offer】15、反转链表的相关文章

[剑指Offer] 15.反转链表

1 /* 2 struct ListNode { 3 int val; 4 struct ListNode *next; 5 ListNode(int x) : 6 val(x), next(NULL) { 7 } 8 };*/ 9 class Solution { 10 public: 11 ListNode* ReverseList(ListNode* pHead) { 12 ListNode* p = pHead; 13 ListNode* q = NULL; 14 ListNode* r

剑指OFFER之反转链表(九度OJ1518)

题目描述: 输入一个链表,反转链表后,输出链表的所有元素.(hint : 请务必使用链表) 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行为一个整数n(0<=n<=1000):代表将要输入的链表的个数.输入的第二行包含n个整数t(0<=t<=1000000):代表链表元素. 输出: 对应每个测试案例,以此输出链表反转后的元素,如没有元素则输出NULL. 样例输入: 5 1 2 3 4 5 0 样例输出: 5 4 3 2 1 NULL 解题思路:

剑指offer——26反转链表

题目描述 输入一个链表,反转链表后,输出新链表的表头. 题解: 每次只反转一个节点,先记住cur->next, 然后pre->cur,即可; 1 class Solution { 2 public: 3 ListNode* ReverseList(ListNode* pHead) { 4 if (pHead == nullptr || pHead->next == nullptr)return pHead; 5 ListNode *pre = nullptr, *cur = nullpt

【剑指offer】反转链表

题目链接:反转链表 题意: 输入一个链表,反转链表后,输出新链表的表头. 题解:用三个指针,分别指向当前结点,它的前一个结点和后一个结点. 在遍历过程中,将当前结点的尾结点和前一个结点替换. 代码: 1 /* 2 struct ListNode { 3 int val; 4 struct ListNode *next; 5 ListNode(int x) : 6 val(x), next(NULL) { 7 } 8 };*/ 9 class Solution { 10 public: 11 Li

剑指offer 15:链表的倒数第k个节点

题目描述 输入一个链表,输出该链表中倒数第k个结点. 解题思路 使用快慢指针法,让快指针先走k步,然后再让慢指针开始走,当快指针到达链表尾部时,慢指针刚好到达倒数第k个节点. C++代码实现: /* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } };*/ class Solution { public: ListNode* FindKthToTail(ListN

【剑指offer】复杂链表的复制

转载请注明出处:http://blog.csdn.net/ns_code/article/details/26154691 题目描述: 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点). 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行为一个整数n (1<=n<=1000):n代表将要输入的链表元素的个数.(节点编号从1开始).接下来有n个数,表示链表节点中的值.接下来有n个数Ti,Ti表示第i个节点的另

剑指offer (27) 复杂链表的复制

题目:请实现一个函数,复制一个复杂链表,在复杂链表中,每个结点除了有一个m_pNext指针指向下一个结点,还有一个m_pSibling指向链表中的任意节点或者NULL struct ComplexListNode { int m_nValue; ComplexListNode* m_pNext; ComplexListNode* m_pSibling; }; 方法一: step1. 复制原始链表的每一个节点,并用m_pNext链接起来 step2. 设置每个结点的m_pSibling指针 由于m

剑指Offer:删除链表的节点【18】

剑指Offer:删除链表的节点[18] 题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 题目分析 如上图所示,我们的定义了三个指针,其中第二.三个指针用于找到重复元素的第一个位置和最后一个位置的下一个位置,然后第一个指针的下一个指向三个指针,这样就跳过了重复元素. 但是编码发现后,还有两种情况欠考虑. 这种情况,刚开始,就是

【Java】 剑指offer(35) 复杂链表的复制

本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 请实现函数ComplexListNode* Clone(ComplexListNode* pHead),复制一个复杂链表.在复杂链表中,每个结点除了有一个m_pNext指针指向下一个点外,还有一个m_pSibling 指向链表中的任意结点或者nullptr. 思路 思路1:先复制结点,用next链接,最后根据原始结点的sibling指针确定该sibling结点距离头结点的位

【剑指Offer】【链表】反转链表

题目:输入一个链表,反转链表后,输出新链表的表头. A:定义3个结点,pNode作移动指针,pRet作输出指针,pPrev作前驱指针    在pNode没有到达链尾之前,循环里创建pNext指针记录pNode的后继结点 如果pNode为空,代表已经到了链尾,输出结果 其他:pNode的next指向pPrev,pPrev指向pNode,pNode指向pNext /* struct ListNode { int val; struct ListNode *next; ListNode(int x)